0
点赞
收藏
分享

微信扫一扫

POJ 3061 Subsequence(尺取)

尺取就像一把可以伸缩的尺子,在形象一点就是一直毛毛虫,爬直线的过程中身体可以伸缩。
对于这道题,一开始让毛毛虫在起点,sum就是第一个点的数,不够s的话,毛毛虫尾部在原地,头部向前走一格,这时在看它覆盖的格子的sum,如果够了s的话,让头部位置不变,尾部向前走一格,再看覆盖的格子的sum值,如果还大于等于s,则尾部再向前,直到小于s,这时尾部再不动,头部再往前。维护一个变量来记录毛毛虫身体覆盖的格子sum大于等于s时身长最短的值就是答案了。

A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S.
Input
The first line is the number of test cases. For each test case the program has to read the numbers N and S, separated by an interval, from the first line. The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file.
Output
For each the case the program has to print the result on separate line of the output file.if no answer, print 0.
Sample Input
2
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
Sample Output
2
3

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

int a[1000005];
int main()
{
int T;
scanf("%d", &T);
while (T--){
int n, s;
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &s);
for (int i=1; i<=n; i++)
scanf("%d", &a[i]);
int start=1, end=1, sum=0;
int minn=1e9;
for (; ;){
sum+=a[end];
while (sum>=s){
int t=end-start+1;
if (t<minn)
minn=t;
start++;
sum-=a[start-1];
}
end++;
if (end==n+1)
break;
}
if (minn==1e9) minn=0;
printf("%d\n", minn);
}
return 0;
}


举报

相关推荐

0 条评论