尺取或者二分
给你n个数,问你这个数列里面加起来大于等于s的最短长度是多少
二分
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[100500];
long long sum[100500];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,s;
cin>>n>>s;
for(int i=0;i<n;i++)
cin>>a[i];
sum[0]=0;
for(int i=0;i<n;i++)
sum[i+1]=sum[i]+a[i];
int res=100000000;
if(sum[n]<s)
{
cout<<0<<endl;
continue;
}
for(int k=0;sum[k]+s<=sum[n];k++)
{
int t=lower_bound(sum+k,sum+n,sum[k]+s)-sum;
res=min(res,t-k);
}
cout<<res<<endl;
}
return 0;
}
尺取
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[100500];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,s;
cin>>n>>s;
for(int i=0;i<n;i++)
cin>>a[i];
int pos1=0,pos2=0;
int res=1000000000;
int sum=0;
while(1)
{
while(pos1<n&&sum<s)
{
sum+=a[pos1++];
}
if(sum<s) break;
res=min(res,pos1-pos2);
sum-=a[pos2++];
}
if(res>n)
cout<<0<<endl;
else
cout<<res<<endl;
}
return 0;
}