Olympic Game
描述:
每次奥运会期间,大家都非常关注奖牌榜排名的情况。
现在我们假设奖牌榜的排名规则,按优先级从高到低如下:
1、金牌 数量多的排在前面;
2、银牌 数量多的排在前面;
3、铜牌 数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排列。
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0。
题目类别: 字符串,排序
难度: 中级
分数:
运行时间限制: 无限制
内存限制: 无限制
阶段: 应聘考试
输入:
第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N行,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi
分别表示每个获得的金、银、铜牌的数量,以空格隔开,如(China 51 20 21)。
具体见Sample Input。
输出:
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见Sample Output。
样例输入:
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0
样例输出:
China
Rusia
France
Japan
England
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct stat{
char name[32];
int gold;
int silver;
int bronze;
}Stat;
void switch_stat(Stat *stat1, Stat *stat2)
{
Stat tmp;
if (!stat1 || !stat2) {
return;
}
tmp = *stat1;
*stat1 = *stat2;
*stat2 = tmp;
}
/* Put your function here */
int main(int argc, char *argv[])
{
int i, j;
unsigned int len;
Stat *vector = NULL;
/* get the array lenth from input */
scanf("%u", &len);
vector = (Stat *)malloc(len * sizeof(Stat));
if (NULL == vector) {
return 1;
}
/* get the array value from input */
for (i=0; i<len; i++) {
scanf("%s %d %d %d", vector[i].name, &vector[i].gold, &vector[i].silver, &vector[i].bronze);
}
/* sort the array */
for (i=0; i<len-1; i++) {
for (j=i+1; j<len; j++) {
if (vector[i].gold < vector[j].gold) {
switch_stat(&vector[i], &vector[j]);
} else if (vector[i].gold == vector[j].gold) {
if (vector[i].silver < vector[j].silver) {
switch_stat(&vector[i], &vector[j]);
} else if (vector[i].silver == vector[j].silver) {
if (vector[i].bronze < vector[j].bronze) {
switch_stat(&vector[i], &vector[j]);
} else if (vector[i].bronze == vector[j].bronze) {
if (strcmp(vector[i].name, vector[j].name) > 0) {
switch_stat(&vector[i], &vector[j]);
}
}
}
}
}
}
for (i=0; i<len; i++) {
printf("%s\n", vector[i].name);
}
free(vector);
return 0;
}