题目描述
传智专修学员的课堂上,为了活跃气氛,并巩固位运算的知识,同学们玩起了一个游戏。
班级里有 n(n\le10^6)n(n≤106) 名同学,每位同学都获得了两张卡,红卡或者黑卡。每张卡上都有一个不超过 10^9109 的非负整数。第 ii 位同学手里红卡数字是 a_iai ,黑卡数字是 b_ibi。
现在需要每位同学出牌。每位同学可以直接将红卡上的数字打出,或者将自己的红卡上的数字和自己黑卡数字进行按位异或操作后的结果打出。最后老师会收集所有同学打出的数字。
这些数字中出现次数最多的数字是众数。在所有同学合作的最优策略下,我们希望众数对应数字出现的次数尽可能多。请问出现次数最多的数字是多少呢?
输入格式
第一行,一个正整数 nn。
接下来 nn 行,其中第 ii 行时非负整数 a_i,b_iai,bi 代表第 ii 名同学手上红卡和黑卡的数字。
输出格式
一个整数,表示答案。如果有多个解,请输出最小的那个。
输入输出样例
输入 #1
4
21 9
28 9
28 3
17 4
输出 #1
21
说明/提示
样例解释:
众数出现次数最多是 33 次,有如下两种方法:
- 11 号同学直接出红卡,22 号同学出红黑异或,33 号同学随便出,44 号同学出红黑异或。这样 1,2,41,2,4 号同学都可以打出 2121。
- 11 号同学出红黑异或,22 号同学直接出红卡,33 号同学直接出红卡,44 号同学随便出。这样 1,2,31,2,3 号同学都可以打出 2828。
所以 2121 和 2828 都是出现次数最多的众数,因为最多可以出现 33 次,不存在出现 44 次的方案。但是由于要求如果有多解输出小的,请输出 2121。
注意异或开long long 以及 a ^ b == c 的情况:
#include <iostream>
#include<iomanip>
#include <math.h>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include<stdio.h>
#include <unordered_map>
#include <utility>
//#include <bits/stdc++.h>
using namespace std;
bool compare(const pair<int, int>& a, const pair<int, int>& b)
{
if (a.second != b.second) return a.second < b.second;
return a.first > b.first;
}
int main(){
int n;
int a, b;
int max_mode;
unordered_map<int, int> mode;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a >> b;
long long c = a ^ b;
if (a == c) {
mode[a]++;
}
else {
mode[a]++;
mode[c]++;
}
}
using pairtype = std::pair<int, int>;//使用pair对象
max_mode = max_element(mode.begin(), mode.end(), compare)->first;
cout << max_mode;
return 0;
}