| 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;
}
本文介绍了一种寻找连续子序列使和大于等于给定值的算法问题,提供了两种解决方案,一种为nlog(n)复杂度,另一种为O(n)复杂度。
624

被折叠的 条评论
为什么被折叠?



