题目链接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));
    }
}
二分法

相关文章: