CF1070K Video Posts 题解

Content

\(n\) 个数 \(a_1,a_2,a_3,...,a_n\),要求分成 \(k\) 段,每一段的数的总和相等。输出这些段的长度,或者不可能满足要求。

数据范围:\(1\leqslant n,k\leqslant 10^5,1\leqslant a_i\leqslant 10^4\)

Solution

我们先暴力扫一遍,把每一段的总和求出来,具体来说,如果有总和 \(=\overline{a_i}\) 的一段,那么就把它加入答案序列里面,这样的话还可以很好地判断无法满足要求的情况。最后再看如果分的段数是否 \(=k\),不等于的话就不可能满足题目要求,否则将答案序列输出即可。

感觉这样讲的不太懂的去看代码理解一下吧。

Code

int n, k, sum, a[100007], s, len = 0, ans[100007];

int main() {
	getint(n), getint(k);
	_for(i, 1, n) {getint(a[i]); sum += a[i];}
	_for(i, 1, n) {
		len++;
		s += a[i];
		if(s == sum / k) {ans[++ans[0]] = len; len = s = 0; if(ans[0] == k && i != n) return printf("No"), 0;}
	}
	if(ans[0] < k)	printf("No");
	else {
		puts("Yes");
		_for(i, 1, ans[0]) {writeint(ans[i]); putchar(' ');}
	}
	return 0;
}
posted @ 2021-12-21 19:48  Eason_AC  阅读(61)  评论(0)    收藏  举报