Time Limit: 3000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
Description
Input
Many test cases will be given. For each test case the program has to read the numbers N and S, separated by an interval, from the first line. The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file.
Output
For each the case the program has to print the result on separate line of the output file. If there isn't such a subsequence, print 0 on a line by itself.
Sample Input
10 15 5 1 3 5 10 7 4 9 2 8 5 11 1 2 3 4 5
Sample Output
2 3
Source
分析:
解法一:
ac代码:nlog(n)
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int a[maxn],b[maxn];
int n,s;
int main()
{
while(scanf("%d%d",&n,&s)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=0;
for(int i=1;i<=n;i++)
b[i]=b[i-1]+a[i];
int ans=n+1;
for(int j=1;j<=n;j++)
{
int i=lower_bound(b,b+j,b[j]-s)-b;
if(i>0) ans=min(ans,j-i+1);
}
printf("%d\n",ans==n+1?0:ans);
}
return 0;
}
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int a[maxn],b[maxn];
int n,s;
int main()
{
while(scanf("%d%d",&n,&s)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=0;
for(int i=1;i<=n;i++)
b[i]=b[i-1]+a[i];
int ans=n+1;
for(int j=1;j<=n;j++)
{
int i=lower_bound(b,b+j,b[j]-s)-b;
if(i>0) ans=min(ans,j-i+1);
}
printf("%d\n",ans==n+1?0:ans);
}
return 0;
}
解法二:O(n)
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int a[maxn],b[maxn];
int n,s;
int main()
{
while(scanf("%d%d",&n,&s)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=0;
for(int i=1;i<=n;i++)
b[i]=b[i-1]+a[i];
int ans=n+1;
int i=1;
for(int j=1;j<=n;j++)
{
if(b[i-1]>b[j]-s) continue;
while(b[i]<=b[j]-s) i++;
ans=min(ans,j-i+1);
}
printf("%d\n",ans==n+1?0:ans);
}
return 0;
}
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int a[maxn],b[maxn];
int n,s;
int main()
{
while(scanf("%d%d",&n,&s)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=0;
for(int i=1;i<=n;i++)
b[i]=b[i-1]+a[i];
int ans=n+1;
int i=1;
for(int j=1;j<=n;j++)
{
if(b[i-1]>b[j]-s) continue;
while(b[i]<=b[j]-s) i++;
ans=min(ans,j-i+1);
}
printf("%d\n",ans==n+1?0:ans);
}
return 0;
}