[面试解答]Olympic Game



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;
}

发布了27 篇原创文章 · 获赞 2 · 访问量 4622

猜你喜欢

转载自blog.csdn.net/xqjcool/article/details/49910863