#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100010;
int p[maxn];
int main()
{
int n,S;
while(scanf("%d%d%d",&n,&S,p)==3)
{
for(int i=1;i<n;i++)
{
scanf("%d",p+i);
p[i]+=p[i-1];
}
if(p[0]>S)
{
printf("0\n");
continue;
}
int ans=S+1,t=n-2;
while(t>=0 && p[n-1]-p[t]<S) t--;
if(t>=0) ans=n-t-1;
for(int i=0;i<t;i++)
{
int j=i+1;
while(p[j]-p[i]<S) j++;
ans=min(ans,j-i);
}
if(ans==S+1) ans=0;
printf("%d\n",ans);
}
return 0;
}
白书上盗来的优化:
令B[i]=A[1]+A[2]+...+A[i]
对于每一个终点,我们的目标是找到B[j]-B[i-1]>=S,且i尽量大
即寻找使B[i-1]<=B[j]-S最大的i
由于j是递增的,B[j]也是递增的,同样,满足条件的i也是递增的
#include<cstdio>
#include<algorithm>
using namespace std;
int const maxn=100010;
int p[maxn];
int main()
{
int n,S;
while(scanf("%d%d%d",&n,&S,p)==3)
{
for(int i=1;i<n;i++)
{
scanf("%d",p+i);
p[i]+=p[i-1];
}
int ans=n+1,i=1;
for(int j=1;j<n;j++)
{
if(p[i-1]>p[j]-S) continue;
while(p[i]<=p[j]-S) i++;
ans=min(ans,j-i+1);
}
printf("%d\n",ans==n+1 ? 0 : ans);
}
return 0;
}