PAT--1044 Shopping in Mars--尺取

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264

题目大意:有n个数,求这n个数当中所有连续的和为m的子数组,如果找不到,就重新找一个和x,使得存在子数组的和为x,并且x要大于m。

分析:对于每个和x,直接尺取即可。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, cnt, a[N];
void solve() {
	int sum = 0, l = 1, r = 1;
	while(r <= n) {
		sum += a[r];
		if(sum == m) {
			cnt++;
			printf("%d-%d\n", l, r);
		} else {
			while(sum > m) {
				sum -= a[l];
				l++;
			}
			if(sum == m) {
				cnt++;
				printf("%d-%d\n", l, r);
			}
		}
		r++;
	}
}
int main() {
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	cnt = 0;
	while(cnt == 0) {
		cnt = 0;
		solve();
		m++;
	}
	return 0;
}
发布了150 篇原创文章 · 获赞 4 · 访问量 6942

猜你喜欢

转载自blog.csdn.net/Napom/article/details/103112670