这倒题挺简单的,容易想到的一个办法是直接排序做,但是网上有一种更加巧妙的做法:
由于所求的数的个数大于等于(n+1)/2,所以所求数出现的次数减去其他数出现的次数的差大于等于1.我们先假设读入的第一个数是所求数,它出现的次数是1,然后依次读入数据,每当读入数据和当前数相同时,出现的次数加一否则减一,当出现的次数减为0的时候,这个数就一定不可能是所求的数,此时,将当前的数作为所求数进行上述操作,直到所有数据读入完毕,那么最后得到的出现次数大于0的数一定是所求数。
代码比较简单
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
int n;
int main()
{
while (scanf("%d",&n)!=EOF)
{
int ans=0,q=0;
for (int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
if (q==0)
{
q++; ans=a;
}
else
if (ans==a) q++; else q--;
}
printf("%d\n",ans);
}
return 0;
}