一个数组中最多能取出几对不同数字 证明

一个数组中最多能取出几对不同数字 证明

Problem - 1506D - Codeforces

给定一个数组,每次从中取出一对不同的数,问最多能取几对。

设数组中共有 \(n\) 个数。

记录数组中每个数的出现次数为 \(cnt\) 。令 \(cnt_{max}\) 为数组中的数最大的出现次数。


如果 \(cnt_{max} > \frac n2\)

那么可以使出现次数最多的数和其他数成对,最后剩余 \(cnt_{max}-(n-cnt_{max})\) 个数。


如果 \(cnt_{max} \leq \frac n2\)

因为每个数出现的次数都小于等于数组的一半,将数组排序后的每一对 \(a_i\)\(a_{i+\frac n2}\) 一定是不同的。

所以如果 \(n\) 为偶数,全部成对,剩余 \(0\) 个数。 \(n\) 为奇数,剩 \(1\) 个数不能成对。


代码

std::max(n % 2, cnt_max - (n - cnt_max));

Problem - 1579D - Codeforces

要输出方案,把 a[i]i 存为 pair 放入大根堆,贪心取出堆顶的两个减 \(1\) 再入堆。

posted @ 2022-08-26 13:27  yHan234  阅读(49)  评论(0)    收藏  举报