欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ-3061【尺取算法】

程序员文章站 2022-06-06 17:04:36
...


参考思路:传送门

题意

  • 链接POJ-3061
  • 给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度

解题思路

  • 过程大致分为四步:
  1. 初始化左右端点,即先找到一个满足条件的序列。
  2. 在满足条件的基础上不断扩大右端点。
  3. 如果第二步无法满足条件则终止,否则更新结果。
  4. 扩大左端点,并且回到第二步。
  • 举个例子:
    n = 10,m = 15
    5 1 3 5 10 7 4 9 2 8POJ-3061【尺取算法】
    则ans=2

代码

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int t,n,s,a[maxn];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&s); 
		for(int i=0;i<n;i++)scanf("%d",&a[i]);
		int l=0,r=0,ans=n+1,sum=0;
		while(1)
		{
			while(r<n&&sum<s)sum+=a[r++];
			if(sum<s)break;
			ans=min(ans,r-l);
			sum-=a[l++];
		}
		if(ans==n+1)printf("0\n");
		else printf("%d\n",ans);
	}
	return 0;
}
相关标签: 学习笔记