POJ3061 Subsequence 尺取法
链接:https://ac.nowcoder.com/acm/problem/107658
来源:牛客网
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S.
输入描述:
The first line is the number of test cases. For each test case the program has to read the numbers N and S, separated by an interval, from the first line. The numbers of the sequence are given in the second line of the test case, separated by intervals. The input will finish with the end of file.
输出描述:
For each the case the program has to print the result on separate line of the output file.if no answer, print 0.
示例1
输入
复制
2
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
输出
复制
2
3
尺取法的板子题
用两个指针(lef, rig)维护一段连续区间
sum维护当前区间的和,当sum<m时,我们就应该向右扩展区间
相反,当sum>=m时,我们就应该收缩左区间
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <stdio.h>
#include <math.h>
#define MAXN ((int)1e5+7)
#define ll long long int
#define INF (0x7f7f7f7f)
#define QAQ (0)
using namespace std;
#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }
#endif
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
int n, m, Q, K, a[MAXN];
int main() {
#ifdef debug
freopen("test", "r", stdin);
clock_t stime = clock();
#endif
scanf("%d ", &Q);
while(Q--) {
scanf("%d %d ", &n, &m);
for(int i=1; i<=n; i++) scanf("%d ", a+i);
int lef = 1, rig = 0, ans = INF, sum = 0;
while(lef <= n) {
//不断扩展右端点
while(rig+1<=n && sum<m) sum += a[++rig];
if(sum >= m)
ans = min(ans, rig-lef+1);
sum -= a[lef]; //收缩左端点
lef ++;
}
//注意没有答案的时候输出0即可
printf("%d\n", ans==INF ? 0 : ans);
}
#ifdef debug
clock_t etime = clock();
printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif
return 0;
}