题意:给定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';
}
标签:Parity,nums,int,Sum,奇数,奇偶性,偶数,maxn
From: https://www.cnblogs.com/yxcblogs/p/18348388