题目链接:
POJ 3061 Subsequence
题意:
给定长度为n的数列整数
a[0],a[1]...a[n−1]
,以及整数s,求出总和不小于s的连续子序列的长度的最小值。
如果解不存在输出0.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
#include <ctime>
#include <cassert>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
using namespace std;
const int MAX_N=100010;
int T,n,s;
int data[MAX_N];
inline int solve()
{
int res=n+1,sum=0,st=0;
for(int i=0;i<n;i++){
sum+=data[i];
if(sum>=s){
int j;
for(j=st;j<=i;j++){
sum-=data[j];
if(sum<s) break;
}
//printf("sum=%d j=%d i=%d\n",sum,j,i);
//最短需要j---i使得sum>=s
res=min(res,i-j+1);
st=j+1;
}
}
if(res==n+1) res=0;
return res;
}
int main()
{
freopen("poj3061in.txt","r",stdin);
IOS;
cin>>T;
while(T--){
cin>>n>>s;
for(int i=0;i<n;i++){
cin>>data[i];
}
int ans=solve();
printf("%d\n",ans);
}
return 0;
}