POJ2092

来源:互联网 发布:域名icp备案查询 编辑:程序博客网 时间:2024/05/16 15:26

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;} 


 

 

0 0