最短区间
现在给定一个整数s以及一个长度为n的整数数列a0,a1,a2,a3…an−1 (全为正数),
请你求出总和不小于s的连续子序列的长度的最小值。如果解不存在,则输出0。
Input
第一行:两个整数,表示 s 与 n,其中1≤s≤10^9,1≤n≤500000; 第二行:n个用空格隔开的整数,表示 a0 a1 … an−1,其中对于任意ai有1≤ai≤10^9。
Output
输出总和不小于s的连续子序列的长度的最小值。 如果解不存在,则输出0。
Sample Input
50 20
10 8 9 3 11 8 5 1 1 1 1 20 8 9 11 4 13 22 9 6
Sample Output
4
AC代码:
#include<iostream>
using namespace std;
int main()
{
int m,n,i,sum=0,len,t=0,h=0;
cin>>m>>n;
int a[n];
len=n+1;
for(i=0;i<n;i++)
cin>>a[i];
while(1)
{
while(t<n&&sum<m)
sum=sum+a[t++];
if(sum<m)
break;
else
{
len=min(len,t-h);
sum=sum-a[h++];
}
}
if(len>n)
len=0;
cout<<len<<endl;
return 0;
}//尺取法经典例题,要好好体会。
尺取法其实也是一种模拟,是解决区间和问题的一种解决方法。尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点得出答案。尺取法比暴力法枚举区间效率高很多。
永远相信美好🎈