傳智杯 眾數出現的次數

2021-10-05 11:47:55 字數 1814 閱讀 7248

題目 2315: [傳智杯]眾數出現的次數

時間限制: 5sec 記憶體限制: 512mb 提交: 318 解決: 120

題目描述

傳智專修學員的課堂上,為了活躍氣氛,並鞏固位運算的知識,同學們玩起了乙個遊戲。

班級裡有 n(n<=10^6) 名同學,每位同學都獲得了兩張卡,紅卡或者黑卡。每張卡上都有乙個不超過 10^9 的非負整數。第 i 位同學手裡紅卡數字是 ai ,黑卡數字是 bi。

現在需要每位同學出牌。每位同學可以直接將紅卡上的數字打出,或者將自己的紅卡上的數字和自己黑卡數字進行按位異或操作後的結果打出。最後老師會收集所有同學打出的數字。

這些數字**現次數最多的數字是眾數。在所有同學合作的最優策略下,我們希望眾數對應數字出現的次數盡可能多。請問出現次數最多的數字是多少呢?

輸入第一行,乙個正整數 n。

接下來 n 行,其中第 i 行時非負整數 ai,bi 代表第 i 名同學手上紅卡和黑卡的數字。

輸出乙個整數,表示答案。如果有多個解,請輸出最小的那個。

樣例輸入

421 9

28 9

28 3

17 4

樣例輸出

21提示

樣例解釋:

眾數出現次數最多是 3 次,有如下兩種方法:

1 號同學直接出紅卡,2 號同學出紅黑異或,3 號同學隨便出,4 號同學出紅黑異或。這樣 1,2,4 號同學都可以打出 21。

1 號同學出紅黑異或,2 號同學直接出紅卡,3 號同學直接出紅卡, 4 號同學隨便出。這樣 1,2,3號同學都可以打出 28。

所以 21 和 28 都是出現次數最多的眾數,因為最多可以出現 3 次,不存在出現 4 次的方案。但是由於要求如果有多解輸出小的,請輸出 21。

這個題在當時比賽時沒有做出來,覺得很難。

假設有n(n<=1e6)個同學,每個同學有可能出紅卡,有可能出紅與黑異或後的卡,雖然兩種方式可能出現相等,如果不考慮相等,那最後的出牌將是2的n次方種組合,如果我去找眾數,那我怎麼記錄呢,每個同學的數字範圍是1e9,太大了吧!

1.對於2的n次方種組合,這個不用管,我把所有可能出現的數記錄一下,6出現的次數最多,那麼6就是眾數,算這個的時候要注意一下,如果紅卡和紅與黑異或後的結果一樣,那得算一次。

2.我們需要乙個陣列,這個陣列要存每個數出現的次數,但是這個數的最大是1e9,陣列開不了這麼大,解決辦法

(1)對映

(2)也是對映,直接c++中的map,map.

/*

* author : michael

* date : 2020-04-26-14.32.54

*/#include

#include

//快排sort()

#include

//能不用cin就不用

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

intmain()

else

}int _max=-1

,pos;

int x,y;

for(map<

int,

int>

::iterator it=mp.

begin()

;it!=mp.

end(

);it++

)else

if(x==_max)

} cout

}

莫隊演算法 區間眾數出現次數

2020.5.19 昨天學完莫隊之後重寫了一遍mcpc19的那一道區間眾數的,發現了幾個可以改進的點。乙個是離散化,港真我不知道原題是怎麼回事兒,上了離散化,後來無論是d query還是路邊的蒲公英好像完全沒必要上離散化,畢竟是1e5個數字,開個陣列記錄下就行了,所以這部分刪掉,然後模擬一下我們查詢...

P6365 眾數出現的次數(水)

思路 利用map,將每個同學的第乙個數字和兩個數字的異或值標記加一。但是有乙個地方需要注意一下,就是如果x x y 的話,就只加1一次就可以了,因為這個同學只能出一次牌。如下 include define ll long long define inf 0x3f3f3f3f using namesp...

CCF 次數出現最多的數

試題編號 201312 1 試題名稱 出現次數最多的數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的乙個。輸入格式 輸入的第一行只有乙個正整數n 1 n 1000 表示數字的個數。輸入的第二行有n...