假设奖牌榜的排名规则如下:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
ZERO = 0,
ONE,
GOLDEN = 0,
SILVER,
BRONZE,
MEDALBUTT,
TWENTY = 20,
TWENTYONE,
N = 21
};
typedef struct TagMedal {
char name[TWENTYONE];
char medal[MEDALBUTT];
} Medal;
Medal g_medal[N];
int g_total = 0;
int CmpMedal(const void *Medal1, const void *Medal2)
{
Medal *M1 = (Medal *)Medal1;
Medal *M2 = (Medal *)Medal2;
if (M1->medal[GOLDEN] == M2->medal[GOLDEN]) {
if (M1->medal[SILVER] == M2->medal[SILVER]) {
if (M1->medal[BRONZE] == M2->medal[BRONZE]) {
return strcmp(M1->name, M2->name);
}else {
return M2->medal[BRONZE] - M1->medal[BRONZE];
}
} else {
return M2->medal[SILVER] - M1->medal[SILVER];
}
} else {
return M2->medal[GOLDEN] - M1->medal[GOLDEN];
}
}
int InitGMeadl()
{
int res = scanf_s("%d", &g_total);
for (int i = 0; res > 0 && i < g_total; ++i) {
res = scanf_s("%s", g_medal[i].name, TWENTYONE);
res |= scanf_s("%d", &g_medal[i].medal[GOLDEN]);
res |= scanf_s("%d", &g_medal[i].medal[SILVER]);
res |= scanf_s("%d", &g_medal[i].medal[BRONZE]);
if (res <= 0) {
printf("[error]%s %d: get %dth ele fail.\n", __FUNCTION__, res, i);
return -1;
}
}
return 0;
}
int main()
{
int res = InitGMeadl();
if (res < 0) {
return res;
}
qsort(g_medal, g_total, sizeof(Medal), CmpMedal);
for (int i = 0; i < g_total; ++i) {
printf("%s\n", g_medal[i].name);
}
return 0;
}