您的位置:首页 > 产品设计 > UI/UE

POJ 3061 Subsequence

2014-08-31 17:59 274 查看
链接:http://poj.org/problem?id=3061

尺取法,《挑战程序设计竞赛》P146

从第一个数字开始,向后扫描。直到sum>=S为止,计算出长度,再从第二个数字开始,直到sum>=S,,计算出长度....

扫描过一遍后,取最小值即可

#include <iostream>
#include<cstdio>
using namespace std;
#define MAX_N 100000
int data[MAX_N];
int N,S;
void solve()
{
int ans=N+1;
int s=0,t=0,sum=0;
for(;;)
{
while(t<N&&sum<S)
sum+=data[t++];
if(sum<S)
break;
ans=min(ans,t-s);
sum-=data[s++];

}
if(ans>N)
ans=0;
cout<<ans<<endl;

}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>N>>S;
for(int i=0;i<N;i++)
scanf("%d",&data[i]);
solve();

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 尺取法