题目链接: http://poj.org/problem?id=3061
题目大意:找到最短的序列长度,使得序列元素和大于S。
解题思路:
两种思路。
一种是二分+前缀和。复杂度O(nlogn)。有点慢。
二分枚举序列长度,如果可行,向左找小的,否则向右找大的。
前缀和预处理之后,可以O(1)内求和。
#include "cstdio" #include "cstring" int sum[100005],n,s,a,T; bool check(int x) { int l,r; for(int i=1;i+x-1<=n;i++) { l=i,r=i+x-1; if(sum[r]-sum[l-1]>=s) return true; } return false; } int main() { //freopen("in.txt","r",stdin); scanf("%d",&T); while(T--) { scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) { scanf("%d",&a); sum[i]=sum[i-1]+a; } int l=0,r=n,ans=0; while(l<=r) { int mid=l+(r-l)/2; if(check(mid)) {ans=mid;r=mid-1;} else l=mid+1; } printf("%d\n",ans); memset(sum,0,sizeof(sum)); } }