题目描述如下:
2012伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:
1、首先gold medal数量多的排在前面;
2、其次silver medal数量多的排在前面;
3、然后bronze medal数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排定。
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0。
解答要求时间限制:1000ms, 内存限制:64MB
输入
第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N行,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi表示每个获得的gold medal、silver medal、bronze medal的数量,以空格隔开,如(China 51 20 21),具体见样例输入。
输出
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见样例输出。
样例
输入样例 1 复制
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0
输出样例 1
China
Rusia
France
Japan
England
答案如下:
这里还熟悉了qsort这个函数。
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数
-
base-- 指向要排序的数组的第一个元素的指针。
-
nitems-- 由 base 指向的数组中元素的个数。
-
size-- 数组中每个元素的大小,以字节为单位。
-
compar-- 用来比较两个元素的函数,即函数指针(回调函数)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int num =0;
typedef struct{
char name[20];
int gold;
int silver;
int bron;
}medal;
/*此处需要注意,字符比较的时候谁小谁在前面*/
int cmpare(medal *P1,medal *P2){
int i=0;
if(P1->gold != P2->gold) {return P2->gold - P1->gold;}
if(P1->silver != P2->silver){return P2->silver - P1->silver;}
if(P1->bron != P2->bron){return P2->bron - P1->bron;}
else {
for(i=0; i<20; i++){
if(P1->name[i] > P2->name[i])
return 1;
else if(P1->name[i] < P2->name[i])
return -1;
}
}
return 0;
}
int main()
{
int i;
medal country[20] = {0};
scanf("%d",&num);
for(i=0;i<num;i++){
scanf("%s",&country[i].name);
scanf("%d",&country[i].gold);
scanf("%d",&country[i].silver);
scanf("%d",&country[i].bron);
}
qsort(country,num,sizeof(medal),cmpare);
for(i=0; i< num; i++){
printf("%s\r\n",country[i].name);
}
return 0;
}