B. Parity and Sum

题意:给定n个数,每次操作任选两个数,将其中较小的数改为它们的和。问最小操作次数可以让n个数奇偶性相同。

思路:如果初始时奇偶性相同,则不操作,否则,最后结果一定是数组中全为奇数。找到最大的奇数,对偶数排序后考虑所有的偶数。如果当前奇数 > 偶数,则更新奇数最大值为偶数和奇数的和。否则,奇数要先变的比偶数大,才能让偶数变为奇数(这个操作只需要一次即可,让奇数与最大的偶数相加)

总结:思维题。

void solve(){
	int n;
	cin >> n;

	vector<long long> nums;
	long long maxn = 0;
	for (int i = 0; i < n; ++i) {
		int t;
		cin >> t;
		if (t % 2 == 0) {
			nums.push_back(t);
		} 
		else {
			maxn = max<long long>(maxn, t);
		}
	}

	if (nums.empty() || nums.size() == n) {
		cout << "0\n";
		return;
	}

	sort(nums.begin(), nums.end());

	int m = (int)nums.size();
	for (int i = 0; i < m; ++i) {
		if (maxn < nums[i]) {
			cout << m + 1 << '\n';
			return;
		}
		maxn += nums[i];
	}

	cout << m << '\n';
}
posted @ 2024-08-08 10:06  _Yxc  阅读(14)  评论(0编辑  收藏  举报