毫无优化时,TLE, 加入二分优化,时间为50ms.强大的二分
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 100005
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,s;
int su=0;
scanf("%d%d",&n,&s);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
su+=a[i];
}
if(su<s) { printf("0\n");continue;}
int sum[N];
bool flag=true;
memset(sum,0,sizeof(sum));
sum[0]=a[0];
if(a[0]>=s) { printf("1\n");continue;}
int len=N;
for(int i=1;i<n;i++)
{
sum[i]=sum[i-1]+a[i];
if(a[i]>=s ) { len=1; flag=false;break;}
if(sum[i]>=s)
{
flag=false;
int left=0,right=i-1,mid=(left+right)>>1;
while(left!=right)
{
if(sum[i]-sum[mid]<s)
right=mid;
else left=mid+1;
mid =(left+right)>>1;
}
len=min(len,i-(left-1));
}
}
if(flag) printf("0\n");
else printf("%d\n",len);
}
return 0;
}
TLE代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 100005
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,s;
int su=0;
scanf("%d%d",&n,&s);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
su+=a[i];
}
if(su<s) { printf("0\n");continue;}
int sum[N];
bool flag=true;
memset(sum,0,sizeof(sum));
sum[0]=a[0];
if(a[0]>=s) { printf("1\n");continue;}
int len=N;
for(int i=1;i<n;i++)
{
sum[i]=sum[i-1]+a[i];
if(a[i]>=s ) { len=1; flag=false;break;}
if(sum[i]>=s)
{
flag=false;
int j=i-1;
while(j>=0&&sum[i]-sum[j]<s)
{
j--;
}
len=min(len,i-(j));
}
}
if(flag) printf("0\n");
else printf("%d\n",len);
}
return 0;
}