暑期集训之Subsequence

来源:互联网 发布:php网站开发入门 编辑:程序博客网 时间:2024/05/22 06:07

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
210 155 1 3 5 10 7 4 9 2 85 111 2 3 4 5
Sample Output
23

今天的一个新的专题,二分专题,开头学长讲解知识点(吐槽一下,学长虽然开始就强调了他第一次讲题,但我想说的是,讲题别老是笑行不行,一会笑一下一会笑一下<.0,反正虽然他说了半天,我还是不是很明白是啥意思,还是自学一下吧)作为专题练习题的第一题,表示开始我确实没看懂题意,我以为是找出数据相加之和大于等于S的最少数据个数,所以我就一开始sort排序,然后每次都让最大的数相加,直到相加之和大于等于S,可是后来看学长博客才明白,这道题的意思是数据的输入顺序不变,再输入顺序不变的情况下找出一个最短子序列,这个序列的和要大于等于S,所以光是看这一点就证明我开始的想法是错误的,不能改变原有序列的顺序,当然,就算是直到原理我也不会做,所以还是看了看学长们的博客,最后才理解了,代码如下,其实不想解释太多了,毕竟这道题不是太难,代码也比较简单,所以也就不注释了,自行理解:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;int a[100005];int inf=100005;int main(){int n;while(scanf("%d",&n)!=EOF){while(n--){int m,s;scanf("%d%d",&m,&s);scanf("%d",&a[0]);for(int i=1;i<m;i++){  scanf("%d",&a[i]);  a[i]=a[i]+a[i-1]; } int p=1,ans=inf; for(int i=0;i<m;i++) { if(a[i]-a[p-1]>=s) { while(a[i]-a[p-1]>=s) p++; p--; ans=min(ans,i-p+1);}  }   if(ans==inf)printf("0\n");elseprintf("%d\n",ans);}}return 0;}



原创粉丝点击