5213: 出现次数超过一半的数
Time Limit: 1 Sec Memory Limit: 256 MB
Submit: 166 Solved: 43
[Submit][Status][Web Board]
Description
给出一个含有 n(0 < n <= 1000) 个整数的数组,请找出其中出现次数超过一半的数。
数组中的数大于等于 -50 且小于等于 50。
Input
第一行包含一个整数 n,表示数组大小;
第二行包含 n 个整数,分别是数组中的每个元素,相邻两个元素之间用单个空格隔开。
Output
题目保证存在这样的数,输出这个数
Sample Input
3 1 2 2
Sample Output
2
HINT
Source
懒得废话,上ac代码。
#include<stdio.h>
int main()
{
int n,i,half;
int a[1001]={0};
int z[51]={0},f[51]={0}; //正数与负数分开存储。
while(~scanf("%d",&n))
{
if(n%2==0)
half=n/2;
if(n%2!=0)
half=(n+1)/2;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0) //如果是正数,则在正数存储数组中进行数量标记。
z[a[i]]++;
if(a[i]<0) //如果是负数,则在负数存储数组中进行数量标记。
f[-a[i]]++;//数组下标都是正数所以需要把负数转换为正数。
}
for(i=0;i<=50;i++)
{
if(z[i]>=half)
printf("%d\n",i);
else if(f[i]>=half)
printf("-%d\n",i); //由于数组下标都是0以上的整数,所以输出时需要添加负号。
}
}
return 0;
}