华为OD机试 - 分奖金( Python)
华为OD机试 - 分奖金( Python)
题目描述:
有n个人参加了一次比赛,比赛结束后,他们按照得分从高到低排名,现在需要将奖金分配给他们。要求:
1. 第一名分得金钱总数的一半,第二名分得第一名的1/2,第三名分得第二名的1/2,以此类推,直到最后一个人分得的钱数为1元。
2. 如果两个人得分相同,则排名靠前的人获得较高的名次,但是仍按照前面的规则分配奖金。
请编写一个函数,输入为一个得分列表,输出为每个人分得的奖金数,保留两位小数。
示例:
输入:[10 20 30 40 50]
输出:[15.00 12.50 10.00 7.50 5.00]
解释:第一名分得25元,第二名分得12.50元,第三名分得6.25元,第四名分得3.125元,第五名分得1元。
思路:
1. 首先将得分列表按照从高到低的顺序排序。
2. 然后按照题目要求,计算每个人分得的奖金数。
3. 最后将每个人分得的奖金数输出。
代码实现:
def distribute_bonus(scores):
# 将得分列表按照从高到低的顺序排序
scores.sort(reverse=True)
# 初始化奖金总数为0
total_bonus = 0
# 初始化每个人分得的奖金数为0
bonus_list = [0] * len(scores)
# 计算每个人分得的奖金数
for i in range(len(scores)):
bonus = 0
if i == 0:
bonus = scores[i] / 2
else:
bonus = bonus_list[i-1] / 2
bonus_list[i] = bonus
total_bonus += bonus
# 将每个人分得的奖金数输出
for i in range(len(scores)):
bonus_list[i] = '%.2f' % bonus_list[i]
return bonus_list
# 测试
scores = [10 20 30 40 50]
print(distribute_bonus(scores)) # ['15.00' '12.50' '10.00' '7.50' '5.00']
代码注释:
1. 首先将得分列表按照从高到低的顺序排序。
scores.sort(reverse=True)
2. 然后按照题目要求,计算每个人分得的奖金数。
for i in range(len(scores)):
bonus = 0
if i == 0:
bonus = scores[i] / 2
else:
bonus = bonus_list[i-1] / 2
bonus_list[i] = bonus
total_bonus += bonus
在循环中,首先判断当前人员是否为第一名,如果是,则分得金钱总数的一半,否则分得上一名的1/2。
3. 最后将每个人分得的奖金数输出。
for i in range(len(scores)):
bonus_list[i] = '%.2f' % bonus_list[i]
return bonus_list
将每个人分得的奖金数保留两位小数,并返回。