一、问题描述
小蓝最近在玩一款RPG游戏,他的角色一共有N个可以加攻击力的技能,其中第i个技能首次升级可以提升Ai点攻击力,以后每次升级增加的点数都会减少Bi。在Ai/Bi 的上取整次后,再升级该技能将不会改变攻击力
现在小蓝可以总计升级M次技能,它可以任意选择升级的技能和次数,请计算小蓝最多可以提高多少点攻击力?
二、输入输出格式
输入第一行包含两个整数N和M
一下N行每行包含两个整数Ai和Bi
输出一行包含一个整数表示答案
样例输入:
3 6
10 5
9 2
8 1
样例输出:
47
三、题目分析及思路
字有点潦草哈哈,整体思路:
① 求出每个技能所有能加的点数
② 将它们放在一个列表中按从大到小排序
③ 取出前M大的元素进行求和
四、代码
import math
# 接收输入
N, M = map(int, input().split())
score = []
for i in range(N):
score.append([int(j) for j in input().split()])
# 接收每个技能对应的点数
# print(score) # [[10, 5], [9, 2]]
# 接下来要计算每个技能所有能升级的点数情况
"""
比如:A1=10,B1=5
n = 1: +A1=+10
n = 2: +(A1-B1)=+5
有一个特点:每个技能加的点数都是降序排列
"""
# 生成一个列表存放所有的点数,只需一维列表即可,因为我们只需要求出最大升级点数,不用知道是哪个技能升级的
res = []
for i in range(N):
# 遍历所有技能
max_n = math.ceil(score[i][0] / score[i][1]) # 每个技能能升级的最大次数为Ai/Bi的上取整
s = 0 # s用来暂时存放每次升级的分数
for n in range(max_n):
s = score[i][0] - n*score[i][1]
res.append(s)
res.sort(reverse=True) # 对列表进行降序
print(res)
# 最后取前M个进行相加
max_score = 0 # 存放最终结果
for i in range(M):
max_score += res[i]
print(max_score)
如果哪里有问题,还请小伙伴们帮忙指正。