输入多组数据 每组数据的第一行是一个n,表示有n个操作(n<=100000) 接下来有n行,有两种操作 1 x 表示添加数字x (x是正整数且在int范围内) 2 输出添加了的数中出现最多次的数,如果有多个,则依次从小到大输出 其中2操作不超过总操作数的1/8。 Output 每个2操作输出出现最多次的数,如果有多个,则依次从小到大输出 SampleInput 6 1 1 2 1 2 2 1 2 2 SampleOutput 1 1 2 2 C++实现
时间: 2024-03-06 16:47:40 浏览: 165
我们第一行包括两个整数n,k(1<=n<=100,k<=6e5),表示有n个数字,目标和为k 第二行输入n个整数(c1 c2
以下是一份C++的代码实现,使用了哈希表和桶排的思想:
```c++
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 100010;
int n;
int op[MAXN];
int x[MAXN];
int cnt[MAXN];
int bucket[MAXN];
int maxCnt, maxNum;
unordered_map<int, int> mp;
int main() {
while (cin >> n) {
mp.clear();
fill(cnt, cnt + MAXN, 0);
fill(bucket, bucket + MAXN, 0);
maxCnt = 0, maxNum = 0;
for (int i = 1; i <= n; i++) {
cin >> op[i] >> x[i];
if (op[i] == 1) {
mp[x[i]]++;
cnt[mp[x[i]]]++;
maxCnt = max(maxCnt, mp[x[i]]);
}
}
for (auto p : mp) {
int num = p.first, c = p.second;
if (c == maxCnt) {
bucket[c]++;
maxNum = max(maxNum, num);
} else if (c > 0) {
bucket[c]++;
}
}
for (int i = maxCnt - 1; i >= 0; i--) {
bucket[i] += bucket[i + 1];
}
for (int i = 1; i <= n; i++) {
if (op[i] == 2) {
if (bucket[x[i]] == 0) {
cout << maxNum << endl;
} else {
int k = min(bucket[x[i]], cnt[x[i]]);
for (auto p : mp) {
if (p.second == x[i]) {
if (k == 1) {
cout << p.first << endl;
break;
} else {
k--;
}
}
}
}
}
}
}
return 0;
}
```
首先遍历一遍输入,记录每个数字出现的次数。同时,用哈希表记录每个数字出现的次数的次数(也就是有多少个数字出现了这么多次)。用桶排记录出现次数相同的数字的数量。最后遍历一遍输入,对于每个操作2,通过桶排和哈希表找到出现次数最多的数字,并输出。
阅读全文