poj3061 Subsequence(尺取法)

来源:互联网 发布:apache kylin 安装 编辑:程序博客网 时间:2024/04/30 02:59

题目链接:https://vjudge.net/problem/POJ-3061

题目大意:连续序列的和大于等于K值得最短的长度是多少

题目思路:尺取法,反复的推进开头与末尾用来求取满足条件的最小区间的方法。

坑点:思路要清晰,理清楚开头与末尾推进的关系

代码:

#include<iostream>#include<cstdio>using namespace std;const int maxn = 1e5+10;int a[maxn];int main(){    int t;    while(~scanf("%d",&t)){        while(t--){            int n,k;            scanf("%d%d",&n,&k);            for(int i=0;i<n;i++) scanf("%d",&a[i]);            int sum=0;            int starti=0;            int len=maxn;            for(int i=0;;){                    while(sum<k&&i<n) sum+=a[i++];                    int tmp=i-starti;                    if(tmp<len) len=tmp;                    int c=0;                    while(sum>=k&&starti<n){                            sum-=a[starti++];                            c++;                    }                    //tmp=i-starti+1;                    //if(tmp<len) len=tmp;                    tmp=tmp-c+1;                    if(tmp<len) len=tmp;                    if(i==n) break;            }            if(len==n&&sum<k) printf("0\n");            else printf("%d\n",len);        }    }}


原创粉丝点击