Description
The International Bridge Association (IBA) has maintained, for several years, a weekly ranking of the best players in the world. Considering that each appearance in a weekly ranking constitutes a point for the player, grandpa was nominated the best player ever because he got the highest number of points.
Having many friends who were also competing against him, grandpa is extremely curious to know which player(s) took the second place. Since the IBA rankings are now available in the internet he turned to you for help. He needs a program which, when given a list of weekly rankings, finds out which player(s) got the second place according to the number of points.
Input
- in each test case there is exactly one best player and at least one second best player,
- each weekly ranking consists of M distinct player identifiers.
The end of input is indicated by N = M = 0.
Output
Sample Input
4 5 20 33 25 32 99 32 86 99 25 10 20 99 10 33 86 19 33 74 99 32 3 6 2 34 67 36 79 93 100 38 21 76 91 85 32 23 85 31 88 1 0 0
Sample Output
32 33 1 2 21 23 31 32 34 36 38 67 76 79 88 91 93 100
这道题的基本题意为要求求出现次数第二多的数,如果有多个的话按数从小到大的顺序输出。
基本思路为设一个结构体,一个数表示标号,另一个数表示出现的个数,然后结构体数组进行排列,输出出现个数第二多的数即可。
源代码如下:
#include<iostream>
#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
class A
{ public:
int x,y;
};
bool cmp(A p,A q)
{
if(p.y!=q.y)return p.y>q.y;
else return p.x<q.x;
}
int main()
{ int i,j,n,m,b,h,max;
while(scanf("%d%d",&n,&m)&&n!=0&&m!=0)
{ A a[10001];
memset(a,0,sizeof(a));
for(i=0;i<n;++i)
for(j=0;j<m;++j)
{
scanf("%d",&b);
a[b].x=b;
a[b].y++;
}
sort(a,a+10001,cmp);
for(i=1,h=-1;i<m*n;++i)
{ if(h>a[i].y)break;
if(a[i].y!=a[0].y)
{ h=a[i].y;
printf("%d ",a[i].x);
}
}
printf("\n");
}
}
需要注意的是输入输出要用scanf跟printf,否则会超时。