您的位置:首页 > 产品设计 > UI/UE

POJ 3061 Subsequence【尺取法】

2017-03-19 14:42 169 查看
原题链接

思路:尺取法,lower_bound

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;

int t, n, s, sum[1000002], a[1000002], ans;

int main(){
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &s);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
sum[0] = 0;
for(int i = 1; i <= n; i++){
sum[i] = sum[i - 1] + a[i];
}
if(sum
< s){
printf("0\n");
continue;
}
ans = n;
for(int i = 1; sum[i] + s <= sum
; i++){
int j = lower_bound(sum + i + 1, sum + n + 1, sum[i] + s) - sum;
ans = min(ans, j - i);
}
printf("%d\n", ans);
}
return 0;
}


还可以再进行优化,代码为:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;

int t, n, s, sum, a[1000002], ans;

int main(){
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &s);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
int t1 = 0, t2 = 0, sum = 0, ans = n + 1;
while(1){
while(sum < s && t2 < n)  sum += a[t2++];
if(sum < s)  break;
ans = min(ans, t2 - t1);
sum -= a[t1++];
}
if(ans == n + 1)  printf("0\n");
else  printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj