码题杯 划分 题型:枚举

80 阅读1分钟

码题集OJ-23划分 (matiji.net)

思想

样例1解析

2 2 3 2 3

sum=2+2+3+2+3=12

12/2=6

样例1有3个2,2+2+2=6 样例1有2个3,3+3=6

所以样例1可以平均分,输出"YES"

样例2解析

2 3 3 3 3

sum=2+3+3+3+3=14 14/2=7

7!=2 && 7!=3+3+3+3

样例2不能平均分,输出"NO"

code

我们先统计一下2,3分别的个数cnt2,cn3。同时计算一下总和。

然后我们看总和是否能被2整除,不能那么就不够平均分,不用再往下算了。

否则,我们可以去枚举2或者枚举3,就拿枚举2举例吧,我们每枚举一个2就去看一下剩下的总和能否被3整除 ,并且看一下剩下的数的个数是否是3的倍数。如果两个条件都满足,就说明可以被平均分,输出"YES",否则就说明不能被平均分,输出"NO"

#include <bits/stdc++.h>
using namespace std;
int cnt2, cnt3, sum;

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		sum += x;
		if (x == 2)
			cnt2++;
		else
			cnt3++;
	}

	if (sum % 2 != 0) {
		cout << "NO" << endl;
		return 0;
	}

	sum /= 2;
	//枚举2
	for (int i = 0; i <= cnt2 && 2 * i <= sum; i++) {
		int res = sum - i * 2;
		if (res % 3 == 0 && res / 3 <= cnt3) {
			cout << "YES" << endl;
			return 0;
		}
	}
	cout << "NO" << endl;
	return 0;
}

image.png