PTA习题解析:获奖(Python)

您所在的位置:网站首页 获奖顺序 PTA习题解析:获奖(Python)

PTA习题解析:获奖(Python)

2024-07-10 04:00| 来源: 网络整理| 查看: 265

目录获奖题干输入格式输出格式测试样例输入输出解题思路完整代码参考资料

获奖 题干

在某次竞赛中,判题规则是按解题数从多到少排序,在解题数相同的情况下,按总成绩(保证各不相同)从高到低排序,取排名前 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 类的 “ 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 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3