题目描述
2012伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:
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),具体见样例输入。
输出
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见样例输出。
首先我们要注意题目中对奖牌数的排序和对国家名称的排序是不一样的,对奖牌数是从大到小,对国家名称是按照字典序排列的,为了便于进行排序,我们可以将奖牌数前面天津爱一个负号,这样使两个排序的元素都从小到大,具体Python代码如下:
import bisect def func(): n = int(input().strip()) alist = [] for i in range(n): name, gold, silver, bronze = input().strip().split() # 获取每一行的数据 gold, silver, bronze = -int(gold), -int(silver), -int(bronze) # 将奖牌数变为负数并与排序 atup = tuple((gold, silver, bronze, name)) # 将需要排序的奖牌数和国家名称加入到元组中 bisect.insort(alist, atup) # 调用bisect方法对每个加入的元素进行排序 for tmp in alist: print(tmp[3]) if __name__ == "__main__": func()