给定长度为n的序列,求总和不小于s的连续子序列长度的最小值。
http://poj.org/problem?id=3061
尺取法。
如样例一:
5 1 3 5 10 7 4 9 2 8
↓
5 1 3 5 10 7 4 9 2 8
↓
5 1 3 5 10 7 4 9 2 8
↓
5 1 3 5 10 7 4 9 2 8
↓
5 1 3 5 10 7 4 9 2 8
↓
5 1 3 5 10 7 4 9 2 8
↓5 1 3 5 10 7 4 9 2 8
↓5 1 3 5 10 7 4 9 2 8
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n, s, t, a[100000 + 10]; int main(){ scanf("%d", &t); while(t--){ scanf("%d%d", &n, &s); for(int i=0; i<n; i++) scanf("%d", &a[i]); int ans, sum = 0, k = 0; while(sum < s && k < n){ sum += a[k++]; } if(sum < s) { puts("0"); continue; } ans = k; for(int i=1; i<n; i++){ sum -= a[i - 1]; while(sum < s && k < n) sum += a[k++]; if(sum >= s) ans = min(ans, k - i); } printf("%d\n", ans); } return 0; }
我写的太丑了QuQ