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