日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数数字

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天中午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的做法

這里送幾組數據給大家:

na[i]yes/no
52 2 3 3 3yes
52 2 2 3 3no
52 2 2 2 3no
31 2 2yes
73 4 4 4 4 4 4yes
63 4 4 4 4 4no
42 2 2 1yes

代碼實現

如果有的犇犇被數據卡了,可以加個讀入優化,還可以把第二個tot循環并到第一個里面
但是本xxjAC了,我就不改了。。

#include <cstdio> #include <iostream> using namespace std; #define MAXN 1000005 int t, n, Min, Max; int a[MAXN]; int main() {scanf ( "%d", &t );while ( t -- ) {scanf ( "%d", &n );Min = 0x7f7f7f7f;Max = 0;for ( int i = 1;i <= n;i ++ ) {scanf ( "%d", &a[i] );Min = min ( Min, a[i] );Max = max ( Max, a[i] );}if ( Max - Min > 1 ) printf ( "no\n" );else {if ( Max == Min && ( Max == 1 || Max == n - 1 ) ) printf ( "yes\n" );else {if ( Max == Min ) {if ( ( Max << 1 ) <= n || Max + 1 == n ) printf ( "yes\n" );else printf ( "no\n" );}else {int tot = 0;for ( int i = 1;i <= n;i ++ )if ( a[i] == Min ) tot ++;if ( ( ( Max - tot ) << 1 ) <= ( n - tot ) && tot < Max ) printf ( "yes\n" );else printf ( "no\n" );}}}}return 0; }

把這道題甩在這兒啦,這里是勵志要做進中國前100強的公司,有問題請call:139紅酒白酒葡萄酒
有不理解的或者補充的歡迎大犇在評論區留言。。。

總結

以上是生活随笔為你收集整理的数数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。