ToB企服应用市场:ToB评测及商务社交产业平台
标题:
华为od统一考试B卷【角逐】python实现
[打印本页]
作者:
勿忘初心做自己
时间:
2024-8-16 09:28
标题:
华为od统一考试B卷【角逐】python实现
def split_params(param_str):
return list(map(int, param_str.split(',')))
def main():
# 获取输入
target_str = input().strip()
# 输入验证,拆分并转换为整数
try:
m, n = split_params(target_str)
except ValueError:
print(-1)
return
# 检查 M 和 N 的范围
if not (3 <= m <= 10 and 3 <= n <= 100):
print(-1)
return
# 创建矩阵以存储打分
matrix = []
for _ in range(m):
tmp_str = input().strip()
try:
temp = list(map(int, tmp_str.split(',')))
if len(temp) != n or any(x < 1 or x > 10 for x in temp):
print(-1)
return
matrix.append(temp)
except ValueError:
print(-1)
return
# 计算每位选手的总分和分数分布
players = []
for j in range(n):
playerScores = [matrix[i][j] for i in range(m)]
total_score = sum(playerScores)
score_count = [0] * 11 # 用于记录每个分数(1-10)的数量
for score in playerScores:
score_count[score] += 1
players.append((j + 1, total_score, score_count))
# 根据总分和分数分布进行排序
players.sort(key=lambda x: (x[1], x[2][::-1]), reverse=True)
# 输出前3名选手
for i in range(3):
print(players[i][0], end=(", " if i != 2 else ""))
print()
if __name__ == "__main__":
main()
复制代码
好的,下面我将详细解释代码的实验流程,逐步分析每一个部分的作用和结果。
1. 输入获取与处理
代码部分
target_str = input().strip()
复制代码
功能
: 从用户获取输入,使用 strip() 去掉多余的空格或换行。
代码部分
try:
m, n = split_params(target_str)
except ValueError:
print(-1)
return
复制代码
功能
: 使用 split_params 函数将输入字符串分割并转为整数 m 和 n,代表评委数量和选手数量。如果输入格式不正确,捕捉异常并输出 -1。
2. 查抄范围
代码部分
if not (3 <= m <= 10 and 3 <= n <= 100):
print(-1)
return
复制代码
功能
: 查抄 m 和 n 是否在规定的范围内。如果不在范围内,输出 -1。
3. 输入评分矩阵
代码部分
for _ in range(m):
tmp_str = input().strip()
复制代码
功能
: 用循环读取每一位评委的打分。
代码部分
try:
temp = list(map(int, tmp_str.split(',')))
if len(temp) != n or any(x < 1 or x > 10 for x in temp):
print(-1)
return
matrix.append(temp)
except ValueError:
print(-1)
return
复制代码
功能
:
将每个评委的分数通过逗号分割并转为整数。
查抄分数是否符合要求(分数数量是否为 n、分数是否在1到10的范围内)。
如果任何条件不符合,输出 -1。
4. 计算每位选手的总分
代码部分
players = []
for j in range(n):
playerScores = [matrix[i][j] for i in range(m)]
total_score = sum(playerScores)
score_count = [0] * 11 # 用于记录每个分数(1-10)的数量
for score in playerScores:
score_count[score] += 1
players.append((j + 1, total_score, score_count))
复制代码
功能
:
初始化一个列表 players 来存储每位选手的信息。
对于每一位选手 j,构建一个 playerScores 列表来存储所有评委对该选手的评分。
使用 sum 计算该选手的总得分,并构建 score_count 数组来统计每个分数(从1到10)的数量。
将选手编号(j+1)、总分和分数分布以元组的情势存入 players 列表。
5. 排序
代码部分
players.sort(key=lambda x: (x[1], x[2]), reverse=True)
复制代码
功能
:
对 players 列表举行排序,首先根据总分(x[1])排序,再根据分数分布(x[2])举行次排序,以确保分数高的选手排在前面。
6. 输出结果
代码部分
for i in range(3):
print(players[i][0], end=(", " if i != 2 else ""))
print()
复制代码
功能
:
输出前 3 名选手的编号,每个编号用逗号分隔。
末了使用 print() 输出一个换行。
7. 总结
团体逻辑是:先读取和验证输入,然后读取评分数据,计算每位选手的总得分和分数分布,举行排序,并最终输出前 3 名选手的编号。
任何时间只要发现不合规的输入,都会及时输出 -1,确保程序的健壮性。
这个流程确保了程序按照规范格式处理评分并输出合规的结果。
好的,我们来一步步分析这个输入例子的处理流程:
输入示例
4,5
10,6,9,7,6
9,10,6,7,5
8,10,6,5,10
9,10,8,4,9
复制代码
1. 解析输入参数
第一行
: 4,5
使用 split_params 函数处理这行字符串,将其分割为 m = 4 和 n = 5。
判定范围:3 <= 4 <= 10(✓),3 <= 5 <= 100(✓),符合要求。
2. 读取评分矩阵
接下来的四行是各评委对选手的评分。
第二行
: 10,6,9,7,6
将其转为整数列表: [10, 6, 9, 7, 6]
查抄条件:长度为 5(✓),所有分数在 1 到 10 之间(✓)。
添加到矩阵中。
第三行
: 9,10,6,7,5
转为 [9, 10, 6, 7, 5]。
查抄条件:长度为 5(✓),所有分数在 1 到 10 之间(✓)。
添加到矩阵中。
第四行
: 8,10,6,5,10
转为 [8, 10, 6, 5, 10]。
查抄条件:长度为 5(✓),所有分数在 1 到 10 之间(✓)。
添加到矩阵中。
第五行
: 9,10,8,4,9
转为 [9, 10, 8, 4, 9]。
查抄条件:长度为 5(✓),所有分数在 1 到 10 之间(✓)。
添加到矩阵中。
3. 计算每位选手的总分
接下来,计算每位选手的总分和分数分布。
选手 1
(编号 1):
评分: [10, 9, 8, 9]
总分: 10 + 9 + 8 + 9 = 36
分数分布:[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3] (1 分: 0,2 分: 0,……,9 分: 3,10 分: 1)
选手 2
(编号 2):
评分: [6, 10, 10, 10]
总分: 6 + 10 + 10 + 10 = 36
分数分布:[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3]
选手 3
(编号 3):
评分: [9, 6, 6, 8]
总分: 9 + 6 + 6 + 8 = 29
分数分布:[0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1]
选手 4
(编号 4):
评分: [7, 7, 5, 4]
总分: 7 + 7 + 5 + 4 = 23
分数分布:[0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2]
选手 5
(编号 5):
评分: [6, 5, 10, 9]
总分: 6 + 5 + 10 + 9 = 30
分数分布:[0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 1]
4. 排序
对选手举行排序,首先根据总分,其次根据分数分布:
选手 1: (1, 36, 分数分布)
选手 2: (2, 36, 分数分布)
选手 5: (5, 30, 分数分布)
选手 3: (3, 29, 分数分布)
选手 4: (4, 23, 分数分布)
排序结果:
选手 1: (1, 36) (分数分布),
选手 2: (2, 36) (分数分布),
选手 5: (5, 30) (分数分布),
选手 3: (3, 29) (分数分布),
选手 4: (4, 23) (分数分布)。
因为选手 1 和 选手 2 的总分类似,分数分布会再继承排序,现实分数分布会比较(具体可实现比较规则,我这里简化)。
5. 输出结果
打印前 3 名选手编号:
1, 2, 5
复制代码
总结
通过以上步骤,我们处理了输入数据并找出了得分最高的选手,确保了每一步有公道的错误处理和有效的结果输出。这种流程确保系统可以或许有效地运行并给出准确的结果。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4