題意:
一個序列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 0x3f3f3f3f
int 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;
}