题目内容
给你一个由正整数组成的集合, 你需要从中删掉尽可能少的数使得该集合的众数出现次数不超过给定的参数 k。
输入描述
第一行有两个正整数 n , k( 1 ≤ k ≤ n ≤ 100000),代表集合大小。
第二行有 n个正整数,范围在 1到 1000000000之间,代表给出的集合。
输出描述
输出一个非负整数,即至少需要从集合中删除几个数才能使得集合中众数的出现次数不超过 k。
样例
输入
5 1
1 3 2 2 1
输出
2
参考解决方案:
//众数数据结构
struct number {
int num;
int count;
};
void func6() {
int n, k;
scanf("%d%d", &n, &k);
int a[100000];
int j = 0; //记录不同数个数
struct number arr[1000];
for (int i = 0; i < 1000; i++) //个数置零
arr[i].count = 0;
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = 0; i < n; i++) {
int temp = j; //temp记录当前不同数个数
for (int m = 0; m <= temp; m++) { //搜索该数是否已保存,有则加一,无则保存至新单元再加一
if (arr[m].count == 0) {
arr[m].num = a[i];
arr[m].count++;
j++;
}
else if (arr[m].num == a[i]) {
arr[m].count++;
}
}
}
int sum = 0;
for (int i = 0; i < j; i++) {
if (arr[i].count > k) {
sum += arr[i].count - k;
}
}
printf("%d", sum);
}