数数字
今天中午1小時,定時兩道,我就知道自己的太陽降落了。。。orz
文章目錄
- 題目
- 題解
- 代碼實現
題目
PB 帶來了若干只蒟蒻。
眾所周知,NTF 是數論學會的會長,于是 PB 準備用數字擊敗 NTF,以證明 PB 比 NTF 更強。
于是 PB 準備了一些卡片,并在每個蒟蒻頭上都貼了一張卡牌。每個卡牌上都寫了一個數字。
由于蒟蒻太弱了,甚至不會看鏡子來了解自己頭上的數字,但他們由于經常被大佬吊打,所以觀察力敏銳,他們都知道別人頭上的數字。
第 i 個蒟蒻會告訴你他看到了 ai 種數字(定義兩個數字不同種當且僅當它們的值不同)
但是由于蒟蒻太弱了,可能會報錯數據,NTF 需要核實是否有一種情況使所有蒟 蒻說的話都正確。(可能情況不唯一)
輸入格式
多組測試,文件第一行一個整數 T,表示測試數據組數;
對于每組數據,第一行,一個整數 n,表示蒟蒻的數量;
第二行,n 個整數用空格隔開,表示數組 ai,意義同題面。
輸出格式
如果至少有一種情況使所有蒟蒻的話都正確,輸出"yes",否則,輸出"no"。
樣例
樣例輸入
2
2
1 1
4
1 3 2 2
樣例輸出
yes
no
數據范圍與提示
對于所有數據,T<=10
對于 20% 的數據,N≤8
對于所有數據,1≦N≤1000000, 0≦ai<N
題解
首先,我們應該明確的最好找的規律就是:
看到的種類的最大值Max和最小值Min的差不應該超過1
證明:假設i看到了x種,j最大的情況也就是i是唯一的數字,而有k的數字與j相同,
這樣也最多是看見了x+1種。
這樣我們接下來就只用分類討論Max = Min和Max = Min + 1的情況
1.Max = Min:
(1)顯而易見,當Max + 1 = n時,是成立的,每一個i都是獨一無二的數字
(2)當Max * 2 <= n時也是成立的,因為要維持i看到的種類不變,就必須至少要有一個a[j]=a[i]
所有要保證每個數至少出現兩次
2.Max = Min + 1:有點雜,請仔細品味!!
我們先假設i報出的數有a[j]=a[i]的情況,那么就意味著i報出的數一定是Max
證明:設i報出了a[i],如果有a[j]=a[i],它就相當于照了一面鏡子,看得見自己的數,
它報出的種類中有一種是自己,即Max,而如果i是獨一無二的數字,它報出的種類就會少一種,即Min
所以,報出的數是Min的數的i頭頂上的數是獨一無二的
所以當我們確定了報出Min的i的個數有tot個的時候,剩下的n-tot個人報的就都是Max了
而對于這Max的考慮就可以變為情況1的做法
這里送幾組數據給大家:
| 5 | 2 2 3 3 3 | yes |
| 5 | 2 2 2 3 3 | no |
| 5 | 2 2 2 2 3 | no |
| 3 | 1 2 2 | yes |
| 7 | 3 4 4 4 4 4 4 | yes |
| 6 | 3 4 4 4 4 4 | no |
| 4 | 2 2 2 1 | yes |
代碼實現
如果有的犇犇被數據卡了,可以加個讀入優化,還可以把第二個tot循環并到第一個里面
但是本xxjAC了,我就不改了。。
把這道題甩在這兒啦,這里是勵志要做進中國前100強的公司,有問題請call:139紅酒白酒葡萄酒
有不理解的或者補充的歡迎大犇在評論區留言。。。
總結
- 上一篇: 怎样设置一个路由器带多个无线路由器如何在
- 下一篇: [ZOJ 3203] 灯泡