BZOJ 2456 mode

       這道題我是受一位大神啓發,寫出的一個看起來沒有一點道理,但他就是正確的解法,總體思路是這樣的,因爲咱們須要求的是數量超過總數一半的數,所以個人想法是,用一個變量記錄當前某個值出現的次數,每出現一次加一,反之減一,若變量爲零,則把某個值替換爲當前值,最後輸出這個當前值便可。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;
}
感謝各位的觀看,但願能對各位有所幫助,謝謝。
相關文章
相關標籤/搜索