• PTA习题解析:获奖(Python)


    获奖

    题干

    在某次竞赛中,判题规则是按解题数从多到少排序,在解题数相同的情况下,按总成绩(保证各不相同)从高到低排序,取排名前 60% 的参赛队(四舍五入取整)获奖,请确定某个队能否获奖。

    输入格式

    首先输入一个正整数 T,表示测试数据的组数,然后是 T 组测试数据。每组测试的第一行输入 1 个整数 n(1 ≤ n ≤ 15)和 1 个字符串 ms(长度小于 10 且不含空格),分别表示参赛队伍总数和想确定是否能获奖的某个队名;接下来的 n 行输入 n 个队的解题信息,每行一个 1 个字符串 s(长度小于 10 且不含空格)和 2 个整数 m,g(0 ≤ m ≤ 10,0 ≤ g ≤ 100),分别表示一个队的队名、解题数、成绩。当然,n 个队名中肯定包含 ms。

    输出格式

    对于每组测试,若某队能获奖,则输出 “YES”,否则输出 “NO”。引号不必输出。

    测试样例

    输入

    2
    3 team001
    team001 2 27
    team002 2 28
    team003 0 7
    14 team010
    team012 5 52
    team013 5 55
    team014 5 57
    team005 7 77
    team002 7 79
    team001 7 89
    team003 7 78
    team014 7 70
    team006 7 75
    team009 7 84
    team007 7 81
    team010 5 62
    team008 5 53
    team011 5 59
    

    输出

    YES
    NO
    

    解题思路

    这道题分别把得分和答题数存在列表或者字典里,然后多次排序或遍历后也能得出结果,但是这种解法并不是很简洁。注意输入的数据是队伍名、队伍答题数和队伍得分,这些属性的相关性是很高的,可以构造一个 Team 类来描述。

    class Team(object):
        def __init__(self, name, count, grade):
            self.name = name      #队名
            self.count = count    #答题数
            self.grade = grade    #得分
    

    构造 Team 类以后,对于每一组输入数据可以实例化为一个 Team 对象来存储。为了方便调试,可以重写魔术方法 “def __ str __(self)”,这样在输出 Team 对象时就可以按照我们规定的格式来构造字符串。

    def __str__(self):
        return ("name: {}; count: {}; grade: {}".format(self.name, self.count, self.grade))
    

    例如对于测试样例 1,使用 print() 输出 Team 对象的效果如下。

    根据题目要求“取排名前 60% 的参赛队(四舍五入取整)获奖”,也就是说需要按照某个规则(题意)对所有的队伍进行排名。按照这个思路,我们可以重载 Team 类的 “<” 运算符,这样对一个 Team 对象的 list 使用 sorted() 函数排序时,就可以按照我们制定的规则来排序。为了实现这一点,需要重写魔术方法 “def __ lt __(self, other)”。

    def __lt__(self, other):
        if self.count == other.count:    #答题数相同的情况下比较总分
            return self.grade > other.grade
        else:                            #答题数不同的情况下比较答题数
            return self.count > other.count
    

    为 Team 对象指定了排序的规则后,接下来就很明了了。首先先读取测试点的数据,将每一组数据实例化为一个 Team 对象后,添加入一个 list 中。

    testNum = int(input())    #队伍总数
    for i in range(testNum):
        teamNum, teamName = input().split(" ")
        teamNum = int(teamNum)
    
        teams = []    #存放所有 Team 对象的 list
        for j in range(teamNum):
            name, count, grade = input().split(" ")
            aTeam = Team(name, int(count), int(grade))    #实例化 Team 对象
            teams.append(aTeam)
    

    接下来只需要对这个 list 排序,即可将所有队伍按照获奖顺序排列。

    '''
    print("排序前:")
    for team in teams:
        print(team)
    '''        
    teams = sorted(teams)
    '''
    print("排序后:")
    for team in teams:
        print(team)
    '''
    

    此处以测试样例 2 为例,将排名前后的情况输出查看。

    最后只需要遍历列表,如果要求判断的队伍的下标在 list 的前 60%,说明有获奖,输出即可。注意下标是从 0 开始计算的,而且需要使用 round() 函数四舍五入。

    for j in range(len(teams)):
        if teams[j].name == teamName:
            if j + 1 <= round(len(teams) * 0.6):
                print('YES')
            else:
                print('NO')
            break
    

    完整代码

    class Team(object):
        def __init__(self, name, count, grade):
            self.name = name
            self.count = count
            self.grade = grade
        
        def __str__(self):
            return ("name: {}; count: {}; grade: {}".format(self.name, self.count, self.grade))
        
        def __lt__(self, other):
            if self.count == other.count:
                return self.grade > other.grade
            else:
                return self.count > other.count
    
    testNum = int(input())
    for i in range(testNum):
        teamNum, teamName = input().split(" ")
        teamNum = int(teamNum)
    
        teams = []
        for j in range(teamNum):
            name, count, grade = input().split(" ")
            aTeam = Team(name, int(count), int(grade))
            teams.append(aTeam)
    
        teams = sorted(teams)
        for j in range(len(teams)):
            if teams[j].name == teamName:
                if j + 1 <= round(len(teams) * 0.6):
                    print('YES')
                else:
                    print('NO')
                break
    

    参考资料

    Python 面向对象编程
    Python的富比较方法__lt__、__gt__之间的关联关系分析
    python 列表排序方法sort、sorted技巧篇

  • 相关阅读:
    Android 设置图片 Bitmap任意透明度
    Android 设置图片透明度
    Android 设置alpha值来制作透明与渐变效果的实例
    Android 仿微信朋友圈点击图片变暗
    Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能
    Android 三种方式实现自定义圆形进度条ProgressBar
    nslookup命令
    netstat命令
    tracert与pathping
    ping命令
  • 原文地址:https://www.cnblogs.com/linfangnan/p/15361209.html
Copyright © 2020-2023  润新知