[面试解答]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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮沉飘摇

码字不易,打赏随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值