Python入门习题(97)——OpenJudge百练习题:竞赛评分

OpenJudge百练第2704号习题:竞赛评分

题目描述

来源
OpenJudge网站 —— 百练习题集-第2704号习题

要求
总时间限制: 1000ms 内存限制: 65536kB

描述

现举行一次小竞赛,参赛的3支队伍,编号为1,2,3.每支队列轮流回答问题,如果回答正确,加10分;回答错误,扣10分;放弃回答不得分.经过多轮答题后,我们要统计各队的名次和得分.
输入
第一行为回答问题的轮次数n.
其余各行分别为1,2,3号队伍答题的结果,回答正确为right,错误为wrong,放弃为give-up.
输出
按名次输出各队的编号和得分.名次相同的在同一行输出,且编号小者靠前.
样例输入
4
right wrong give-up
right right right
wrong right right
right right right
样例输出
(3,30)
(1,20)(2,20)

解题思路

  1. 根据各队回答统计得分。
  2. 按得分从大到小排序。得分一样,序号小的在前。
  3. 输出3支队伍得分。如果后面一支队伍的得分与前一支的得分相同,那么在同一行输出;否则换行后输出。

参考答案

#根据回答answer,得到得分
def ans_score(answer):
    if answer[0] == 'r':  #right
        return 10
    elif answer[0] == 'w': #wrong
        return -10
    else:  #give-up
        return 0

n = int(input())
#统计得分
scores = [0, 0, 0]
for i in range(n):
    ans = input().split()
    for j in range(3):
        scores[j] += ans_score(ans[j])
#排序
team_scores = [(index+1, score) for index, score in enumerate(scores)]
team_scores.sort(key=lambda t_s: t_s[1], reverse=True)
#输出得分
print("(%d,%d)"%team_scores[0], end='')
if team_scores[1][1] < team_scores[0][1]:
    print()
print("(%d,%d)"%team_scores[1], end='')
if team_scores[2][1] < team_scores[1][1]:
    print()
print("(%d,%d)"%team_scores[2])

测试用例

  1. 题目描述给出的测试用例包含一个最高分,接下来两支队伍的得分相同。

  2. 三支队伍的得分不同。
    样例输入
    4
    right right right
    right give-up right
    right right wrong
    right right right
    样例输出
    (1,40)
    (2,30)
    (3,20)

  3. 三支队伍的得分都相同。
    样例输入
    4
    right right right
    right right right
    right right right
    right right right
    样例输出
    (1,40)(2,40)(3,40)

  4. 三支队伍的得分不同。2号队伍得分最高。3号队伍得负分。
    样例输入
    4
    right right wrong
    right give-up right
    wrong right wrong
    right right wrong
    样例输出
    (2,30)
    (1,20)
    (3,-20)

  5. n=1的边界情形。
    样例输入
    1
    wrong give-up right
    样例输出
    (3,10)
    (2,0)
    (1,-10)

小结

  1. 用列表scores存储三支队伍的成绩是必要的。相比于使用3个变量,代码更简短。
  2. 列表的sort方法的key参数用于设定排序关键字。本例中,lambda表达式的值是team_scores列表的元素的第2项,即得分。reverse=True表明从大到小排序。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值