Olympic Game

每次奥运会期间,大家都非常关注奖牌榜排名的情况。

现在我们假设奖牌榜的排名规则,按优先级从高到低如下:

  1. 金牌 数量多的排在前面;
  2. 银牌 数量多的排在前面;
  3. 铜牌 数量多的排在前面;
  4. 若以上三个条件仍无法区分名次,则以国家名称的字典序排列。

我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0。

输入描述

第一行输入一个整数N(0<N<21),代表国家数量;

然后接下来的N行,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi
分别表示每个获得的金、银、铜牌的数量,以空格隔开,如(China 51 20 21)。

输出描述

输出奖牌榜的依次顺序,只输出国家名称,各占一行。

样例输入

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<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct  country {
    char name[20];
    int gold;
    int silver;
    int bronze;
}Ctry;

// 交换array1与array2的值
void SwitchCtry(Ctry *array1, Ctry *array2)
{
    Ctry temp;
    
    if(!array1 || !array2)
    {
        return;
    } 
    temp = *array1;
    *array1 = *array2;
    *array2 = temp;
}

// 对array数组按照规则进行排序
void Sort(Ctry *array, int n)
{
    
    for(int i = 0; i < n - 1; i++)
    {
        for(int j = i + 1; j < n; j++)
        {
            if(array[i].gold < array[j].gold)
            {
                SwitchCtry(&array[i], &array[j]);
            }
            else if (array[i].gold == array[j].gold)
            {
                if (array[i].silver < array[j].silver)
                {
                    SwitchCtry(&array[i], &array[j]);
                }
                else if (array[i].silver == array[j].silver)
                {
                    if (array[i].bronze < array[j].bronze)
                    {
                        SwitchCtry(&array[i], &array[j]);
                    }
                    else if (array[i].bronze == array[j].bronze)
                    {
                        //strcmp()函数用到<string.h>
                        if(strcmp(array[i].name, array[j].name) > 0)
                        {
                            SwitchCtry(&array[i], &array[j]);
                        }
                    }
                }
            }
        }
    }
}

int main()
{
    int n;
    Ctry *array = NULL;
    
    scanf("%d", &n);
    if (n <= 0 || n >= 21)
    {
        return 1;
    }
    // 开辟结构体指针空间
    array = (Ctry *)malloc(n * sizeof(Ctry));
    if(array == NULL)
    {
        return 1;
    }
    // 获取输入值
    for(int i = 0; i < n; i++)
    {
        scanf("%s %d %d %d", array[i].name, &array[i].gold, &array[i].silver, &array[i].bronze);
    }
    
    Sort(array, n);
    // 打印输出结果
    for (int j = 0; j < n; j++)
    {
        printf("%s\n", array[j].name);
    }
    // 释放指针
    free(array);
    // 指针释放后置NULL
    array = NULL;
    
    return 0;
}

个人主页:

www.codeapes.cn

posted @ 2019-12-24 21:50  Codeapes  阅读(698)  评论(0编辑  收藏  举报