P6365 [传智杯 #2 初赛] 众数出现的次数 ----- 哈希、pair对象、自定义mex_element

这是一个关于位运算的编程问题,描述了在一组学生中,每个人拥有两张卡片,分别带有红黑两个非负整数。学生们可以选择打出红卡数字或红黑卡片异或后的结果,目标是通过最优策略使得众数出现次数尽可能多。输入输出样例展示了一个具体的解题过程,最终求解出现次数最多的数字。代码中使用了unordered_map来统计每个数字出现的频率,并找出最大众数。
摘要由CSDN通过智能技术生成

题目描述

传智专修学员的课堂上,为了活跃气氛,并巩固位运算的知识,同学们玩起了一个游戏。

班级里有 n(n\le10^6)n(n106) 名同学,每位同学都获得了两张卡,红卡或者黑卡。每张卡上都有一个不超过 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值