POJ 3061 Subsequence【尺取法】
2017-03-19 14:42
169 查看
原题链接
思路:尺取法,lower_bound
AC代码:
还可以再进行优化,代码为:
思路:尺取法,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】[3061]Subsequence
- POJ - 3061 Subsequence(前缀和+二分和尺取法)
- poj 3061 Subsequence 【尺取法 or STL lower_bound】
- [POJ] 3061 Subsequence (尺取法)
- poj-3061-Subsequence(二分思想)
- poj 3061 Subsequence
- POJ 3061 Subsequence(二分/尺取法)
- POJ-3061 Subsequence(尺取法)
- poj 3061 Subsequence(二分,尺取法)
- POJ 3061 Subsequence
- poj 3061 Subsequence(尺取法)
- POJ 3061 Subsequence 二分或者尺取法
- poj 3061 Subsequence 二分
- POJ 3061 Subsequence
- POJ 3061 Subsequence (尺取法)
- POJ 3061 Subsequence (迟取法_预处理,连续子序列)
- Greedy:Subsequence(POJ 3061)
- poj 3061 Subsequence
- poj 3061 Subsequence【简单尺取】
- POJ 3061 Subsequence(尺取法)