poj 3061
二分搜索
//956k, 79ms
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX_N = 100005;
int t, n, s;
int arr[MAX_N], sum[MAX_N];
void solve() {
for(int i=0; i<n; i++)
sum[i+1] = sum[i] + arr[i];
if(sum[n] < s) {
printf("0\n");
return;
}
int res = n;
for(int i=0; sum[i] + s <= sum[n]; i++) {
int t = lower_bound(sum+i, sum+n, sum[i]+s) - sum;
res = min(res, t-i);
}
printf("%d\n", res);
}
int main() {
freopen("in.txt", "r", stdin);
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &s);
for(int i=0; i<n; i++)
scanf("%d", &arr[i]) ;
solve();
}
fclose(stdin);
return 0;
}
尺选法
//556k, 79ms
#include <iostream>
using namespace std;
const int MAX_N = 100005;
int n, s, t;
int a[MAX_N];
void solve() {
int res = n + 1;
int i=0, j=0, sum=0;
for(;;) {
while(j<n && sum<s)
sum += a[j++];
if(sum < s) break;
res = min(res, j-i);
sum -= a[i++];
}
if(res > n) res = 0;
printf("%d\n", res);
}
int main() {
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &s);
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
solve();
}
return 0;
}