hdu 1029 Ignatius and the Princess IV

Ignatius and the Princess IV

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


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
5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1
 

 

Sample Output
3
5
1
 
本题题意是让你在给出的数组之中,找到出现次数大于等于(n+1)/2次的数字。
我一开始的想法是:设置map数组标记数字出现的次数,只要次数到达了(n+1)/2,就把这个数字记录下来,然后输出。但是我们只知道n的大小,不知道这n个数字的大小,要是要这样 开数组标记的话,就要开2^31-1这么大。(不过这个题目的测试案例数字不大,可以这么写)
代码思路:设置num和flag变量,

我们按照序列依次扫描,先把第一个x的值给flag
计数器num++ 然后向右扫描

如果输入的x跟flag相同 那num就++,不同,就 --,
一直重复下去,到了最后flag就是我们想要的那个多元素。

下面是代码:

#include <stdlib.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
while(~scanf("%d",&n))
{
int num=0,flag,x;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(num==0)
{
num++;
flag=x;
}
else if(flag==x)
{
num++;
}
else
{
num--;
}
}
printf("%d\n",flag);
}
return 0;
}

 

 
posted @ 2017-03-17 10:42  红雨520  阅读(139)  评论(0编辑  收藏  举报