题目
题意:给定一个长度为
n
n
n的数组,将这数组的元素分配到k个集合
s
t
i
st_i
sti里边,要求每个元素都分配到其中一个集合,且每个集合不能为空。问怎么分配,才能使最终所有集合的大小和,最小。即求
m
i
n
(
s
u
m
i
=
1
k
(
s
t
i
.
s
i
z
e
(
)
)
)
min(sum_{i=1}^k(st_i.size()))
min(sumi=1k(sti.size()))。其中k取1到n。
思路:贪心,将相同元素分配到同个集合,使相同的元素,贡献为1。
令
n
u
m
num
num表示数组中不同元素的个数,对于
k
<
=
n
u
m
knum
k>num的情况,由于此时集合数量超过了不同元素个数,我们只能将相同元素,拆分到新的集合中。此时答案为
k
k
k。
#include
using namespace std;
#define ll long long
const int maxn = 300010;
int n, a[maxn], x;
set st;
// 排序和set都能过,unordered_set T了,有点神奇
//unordered_set st;
void solve() {
scanf("%d", &n);
st.clear();
int num = 0;
for (int i = 0; i
关注
打赏
