暑期集训之Subsequence

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

今天的一个新的专题,二分专题,开头学长讲解知识点(吐槽一下,学长虽然开始就强调了他第一次讲题,但我想说的是,讲题别老是笑行不行,一会笑一下一会笑一下<.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");
		else
		printf("%d\n",ans);
		}
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值