给定一个长度为 n 的序列 a我们通过以下方式构造序列:初始时 b=a。依次对 b 进行 k 次操作每次操作选择任意一个元素并将其修改为任意整数。一个序列的众数为所有出现次数最大的数你需要求出有多少整数可能成为 b 的众数。第一行输入两个整数 nk。第二行输入 n 个整数 a 输出一个整数代表可能成为众数的数的数量。特别地如果答案为正无穷输出 pigstd。 不用unordered map不用au
首先,我们可以统计序列 a 中每个数出现的次数,并记录出现次数最大的数(即众数)。这可以通过一个数组 count 来实现,count[i] 表示数 i 出现的次数。
然后,我们可以将序列 a 中的每个数依次修改为 b 中的一个数,判断修改后的序列 b 中的众数是否改变。如果改变了,说明该数不可能成为 b 的众数;如果没有改变,说明该数仍然可能成为 b 的众数。
具体的算法如下:
- 初始化 count 数组,将每个元素的出现次数初始化为 0。
- 遍历序列 a,对于每个数 a[i],将 count[a[i]] 的值加 1。
- 找出 count 数组中的最大值 max_count,即众数出现的次数。
- 初始化可能成为众数的数的数量为 0。
- 遍历序列 a,对于每个数 a[i],将 count[a[i]] 的值减 1,并将该数修改为一个不在序列 a 中出现的数。
- 再次遍历序列 a,对于每个数 a[i],如果 count[a[i]] 的值等于 max_count,则将可能成为众数的数的数量加 1。
- 输出可能成为众数的数的数量。
下面是具体的实现:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 1000;
int main() {
int n, k;
int a[MAX_N];
int count[MAX_N] = {0};
// 输入 n 和 k
cin >> n >> k;
// 输入序列 a
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 统计序列 a 中每个数的出现次数,并找出众数的出现次数
int max_count = 0;
for (int i = 0; i < n; i++) {
count[a[i]]++;
max_count = max(max_count, count[a[i]]);
}
// 初始化可能成为众数的数的数量
int possible_count = 0;
// 遍历序列 a,依次修改每个数,并判断众数是否改变
for (int i = 0; i < n; i++) {
// 将 count[a[i]] 的值减 1
count[a[i]]--;
// 将 a[i] 修改为一个不在序列 a 中出现的数
int new_num = 0;
while (count[new_num] > 0) {
new_num++;
}
a[i] = new_num;
// 判断众数是否改变
bool is_changed = false;
for (int j = 0; j < n; j++) {
if (count[a[j]] == max_count) {
is_changed = true;
break;
}
}
// 如果众数没有改变,则将可能成为众数的数的数量加 1
if (!is_changed) {
possible_count++;
}
}
// 输出可能成为众数的数的数量
cout << possible_count << endl;
return 0;
}
该算法的时间复杂度是 O(n^2),其中 n 是序列的长度
原文地址: https://www.cveoy.top/t/topic/h5rn 著作权归作者所有。请勿转载和采集!