首页 > 代码库 > poj 3061

poj 3061

先是看了一下讲解 ,选取 了二分法 ,由于数列都是正数的特殊情况,每一个sum【i】+s 对应一个最小的连续序列,最后只要减掉sum【i】就可以,lower_bound刚好可以用来查找最小的sum【i】+i,算法复杂度(nlogn),另外还有一种尺取法,复杂度只有n,大意是设置t,s两个节点,不断加减来更新res的最小值

下面是ac过的法一代码******************************************

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include <algorithm>


using namespace std;
const int maxn=100010;
int a[maxn];
int sum[maxn];
int times;
int n,s;
int res;
////////////////////
void solve(){


    for(int j=0;j<n;j++){
        sum[j+1]=sum[j]+a[j];
        //cout<<sum[j]<<endl;
    }


    if(sum[n]<s){
       // cout<<‘0‘<<endl;
       printf("0\n");
       return ;//不要忘了跳出
    }
    res=n;
    for(int i=1;sum[i]+s<sum[n];i++){
        int t=lower_bound(sum+i,sum+n,sum[i]+s)-sum;
        res=min(res,t-i);
    }
    cout<<res<<endl;
}
int main(){
    cin>>times;
    while(times--){
        cin>>n>>s;
        memset(a,0,sizeof(a));
        memset(sum,0,sizeof(sum));
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        solve();
    }
    return 0;
}

poj 3061