HDU - 1029 Ignatius and the Princess IV(DP?)

Ignatius and the Princess IV

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32767 K (Java/Others)
Total Submission(s): 39043    Accepted Submission(s): 17042


Problem Description
"OK, you are not too bad, em... But you can never pass the next test." feng5166 says.

"I will tell you an odd number N, and then N integers. There will be a special integer among them, you have to tell me which integer is the special one after I tell you all the integers." feng5166 says.

"But what is the characteristic of the special integer?" Ignatius asks.

"The integer will appear at least (N+1)/2 times. If you can't find the right integer, I will kill the Princess, and you will be my dinner, too. Hahahaha....." feng5166 says.

Can you find the special integer for Ignatius?
 

Input
The input contains several test cases. Each test case contains two lines. The first line consists of an odd integer N(1<=N<=999999) which indicate the number of the integers feng5166 will tell our hero. The second line contains the N integers. The input is terminated by the end of file.
 

Output
For each test case, you have to output only one line which contains the special number you have found.
 

Sample Input
51 3 2 3 3111 1 1 1 1 5 5 5 5 5 571 1 1 1 1 1 1
 

Sample Output
351
 

Code
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    const int N = 999999;
    int i,n,a[N];
    while(~scanf("%d",&n))
    {
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        printf("%d\n",a[(n+1)/2]);
    }
    return 0;
}

反思:題目大意:給出N個數(N爲奇數),至少出現過(N+1)/2次的數是特殊數,輸出特殊數。做法有很多,這裏選擇將這組數進行排序,出現次數超過50%的數就在(N+1)/2的位置上,直接輸出即可。其實這是一個“尋找多數問題”——主元素問題:已知數組,其中出現頻率大於50%的數就是數組的主元素。這樣的序列有一種性質:在原序列中去掉兩個不同的數,在原序列中出現次數超過50%的數在新序列中出現次數也一定超過50%。當數組有序時,可以用中位數的方法解決。還有一種思路是使用減治法,等學會再補上做法。當時覺得題目很簡單沒有多想,直到看《啊哈算法》的時候纔看到這個問題,其實還有很多種解法,自己的知識還是太少了,以後每道題都得認真思考思考~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章