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