poj 3061

来源:互联网 发布:新网域名管理密码 编辑:程序博客网 时间:2024/06/06 03:32

二分搜索

//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;}
0 0
原创粉丝点击