LA_2678 - Subsequence( 二分 )

来源:互联网 发布:apk软件编写 编辑:程序博客网 时间:2024/05/01 07:14
題意:一個序列S,其中的元素全部都是正整數,求最短連續的子序列,使得其和小於等於s分析:由於全部元素是正整數,設f[i]爲前i個的和,那麼f是遞增的f[j]-s >= f[i],其中i越大連續序列的長度越小,所以這裏可以使用二分求出i,時間複雜度O(nlogn).Code:#include <cstdio>#include <cstring>#include <map>#include <algorithm>using namespace std;#define MAXN    100000 + 10#define INF     0x3f3f3f3fint f[MAXN];int main(int argc, char **argv){#ifndef ONLINE_JUDGE        freopen("test.in", "r", stdin);#endif        int ans, n, s, v;        while( ~scanf("%d %d", &n, &s) ) {                ans = INF, f[0] = 0;                for(int i = 1; i <= n; i ++) {                        scanf("%d", &v);                        f[i] = f[i-1]+v;                        int idx = lower_bound(f+1, f+i, f[i]-s)-f;                        if( 1 == idx ) {                                continue;                        }                        ans = min(ans, i-idx+1);                }                printf("%d\n", INF == ans? 0 : ans);        }        return 0;}