题目网站:http://acm.hdu.edu.cn/showproblem.php?pid=1029
感觉没什么知识点,关键是将数组里面的数按从小到大排序,排完序后按相同的计数。
要考虑特殊情况,比如
2
1 2
结果是:1
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
int zs[MAX];
int ccmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;//将数组从大到小排序
}
int main(int argc, char *argv[])
{
int n;
int sum;
int i;
int flag;
while(scanf("%d",&n)!=EOF&&n)
{
sum=1;
flag=1;
for (i=0;i<n;i++)
{
scanf("%d",&zs[i]);
}
qsort(zs,n,sizeof(zs[0]),ccmp);
for(i=0;i<n-1;i++)
{
if(zs[i]==zs[i+1])
{
sum++;
}
else
{
if(sum>=((n+1)/2))
{
printf("%d\n",zs[i]);
flag=0;
break;
}
else
{
sum=1;
}
}
}
if(zs[i]==zs[i-1]&&flag)
{
if(sum>=((n+1)/2))
{
printf("%d\n",zs[i]);
}
}
}
return 0;
}
网上有一个很好的,根本不用开一个数组进行存数
网上代码:
#include<stdio.h>
int main()
{
int n,ans,temp,c;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d",&ans),c=1;
for(int i=2;i<=n;++i)
{
scanf("%d",&temp);
c+=(temp==ans?1:-1);
if(!c)
scanf("%d",&ans),++i,c=1;
}
printf("%d\n",ans);
}return 0;
}
//意思是成对删除,如果该对的两个数相同那么就跳过。能得出结果的原因是:不相同的都抵消了,剩下的一定是大于一半的那个数,因为其他数都小于一半,都抵不过我们要查找的那个数(即大于一半的那个数)