一、问题引入
一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。
输入格式:
输入在第一行给出一个正整数N(≤10^4)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例:
22 Amy
二、解题步骤
1.思维导图
2.解题步骤
- 问题分析
• 输入:N个玩家,每个玩家有一个名字和一个猜测的数字(≤100)。
• 输出:大家平均数的一半(整数部分)和赢家的名字。
• 赢家规则:谁的猜测数字最接近平均数的一半。 - 关键步骤
• 计算总和:将所有玩家猜测的数字相加得到总和。
• 计算平均数的一半:总和除以玩家数量得到平均数,再除以2并取整数部分。
• 寻找赢家:遍历所有玩家,找到猜测数字最接近平均数一半的玩家。 - 边界条件
• 唯一赢家:题目保证赢家唯一,无需处理平局情况。
• 大N处理:N可以大到10^4。
三、代码实现
n = int(input())
players = []
total = 0
# 读取输入数据
for _ in range(n):
name, num = input().split()
num = int(num)
players.append((name, num))
total += num
# 计算平均数的一半(整数部分)
avg_half = total // n // 2
# 寻找最接近的玩家
winner = None
min_diff = float('inf')
for name, num in players:
diff = abs(num - avg_half)
if diff < min_diff:
min_diff = diff
winner = name
elif diff == min_diff:
# 题目保证赢家唯一,所以不需要处理平局情况
pass
print(avg_half, winner)
四、个人小结
通过这次实验,我深入理解了如何利用编程解决涉及数学计算和逻辑判断的场景。实验要求我们在一组玩家的猜测数字中找到最接近平均数一半的赢家,这让我学会了如何高效处理输入数据、进行数值计算以及遍历比较。
在编写代码的过程中,我更加熟悉了列表操作、循环结构和条件判断,同时也巩固了整数除法和绝对值运算的使用。此外,我认识到边界条件的重要性,例如题目保证赢家唯一,避免了平局处理的复杂性,这提醒我在实际编程中要仔细阅读题目要求,确保逻辑的严谨性。通过调试和优化代码,我进一步提升了问题分析和错误排查的能力。
这次实验不仅增强了我的编程实践技能,还让我体会到算法设计在解决实际问题中的关键作用,为今后学习更复杂的数据结构和算法打下了坚实基础。总的来说,这次实验让我在动手实践中积累了宝贵经验。