POJ2092 爷爷很出名
给一个N行M列的数字矩阵,每个格子里有一个数,求出现次数,第二多的数是哪个?
输入:第一行 N M 以下为一个N行M列的数字矩阵 且2<=N,M<=500,矩阵中的数在1到10000之间。
输出:出现次数第二多的数。
分析:可以用num[i]=X表示第i个数是X,且sum[X]=Y表示数X出现了Y次,然后对num排序,不过重新定义cmp函数比较的是sum[num[i]]而不是num[i]。
代码:
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=10100;
int num[maxn],sum[maxn],cnt;
int cmp(int a,int b)
{
return (sum[a]>sum[b])||(sum[a]==sum[b]&&a>b);
}
void insert(int x)
{
for(int i=0;i<cnt;i++)
if(num[i]==x) return;
num[cnt++]=x;
}
int main()
{
intn,m;
while(scanf("%d%d",&n,&m)==2&&n&&m)
{
cnt=0;
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int x;
scanf("%d",&x);
sum[x]++;
insert(x);
}
}
sort(num,num+cnt,cmp);
int i,j;
for(i=1;i<cnt;i++)if(sum[num[i]]<sum[num[i-1]])break;
for(j=i+1;j<cnt;j++)if(sum[num[j]]!=sum[num[j-1]])break;
for(j--;j>i;j--)printf("%d ",num[j]);
printf("%d",num[i]);
printf("\n");
}
return 0;
}