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;
}


全部评论

相关推荐

在喝茶的杨桃很郁闷:我简单喵两句: 1.如果不是实在没东西写不要写熟悉async await这些语法层面的东西 2.也不要写熟悉HTTP,因为http内容很多,稍微深挖一点你不会的话会让人有一种“原来你简历上面的东西都没有完全掌握”的感觉,容易给自己挖坑 3.自我评价可以删了 4.我在复习明天的面试,先mark,后面再回来继续建议
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务