這道題我是受一位大神啓發,寫出的一個看起來沒有一點道理,但他就是正確的解法,總體思路是這樣的,因爲咱們須要求的是數量超過總數一半的數,所以個人想法是,用一個變量記錄當前某個值出現的次數,每出現一次加一,反之減一,若變量爲零,則把某個值替換爲當前值,最後輸出這個當前值便可。spa
是否是很詭異,但他就是對的,讓我來給你分析一下,咱們要的結果一定大於總數一半,所以他出現的個數必定大於非他的個數,假設一組數據以下5,6,5,5,3,5,3,4,5,3,5,這裏結果應爲5,按思路來想沒問題,那咱們如今想辦法卡死他,惟一有可能的方法就是最開始不是5,而後開始不斷消耗5,當不得不更換數字時,不讓他是5,則以下:3,3,5,3,5,5,6,5,4,5,5,好的這個方法失敗了,那麼換個思路,開始是5,快結束時換成不是5,則以下:5,5,5,5,5,6,4,3,3,3,5,依然失敗了,因而可知,這個方法是正確的。code
代碼以下(簡單!簡單!再簡單!):blog
#include<cstdio> using namespace std; int n,a,tot,now; int main() { scanf("%d",&n); while (n) { n--; scanf("%d",&a); if (now==a) tot++; else { tot--; if (tot<=0) { tot=1; now=a; } } } printf("%d",now); return 0; }