每日一题 | 召唤兽问题

时间:2022-07-23
本文章向大家介绍每日一题 | 召唤兽问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

昨日问题

题目出自codeforces,链接:https://codeforces.com/gym/102625/problem/C

这是C题,算是有一定难度了,但其实也并不算难。这是一定经典的贪心问题,我们希望最终得到的结果最大,并且改成绩的次数是有限的,所以题目可以等价于我们每次改动成绩的收益最大

那怎么样可以做到收益最大呢?就更简单了,我们每次将改动后成绩最好的改动应用在当前成绩最低的科目上。

比如在这个例子当中,我们第二门课的成绩最低只有1分,而第二个改动可以改成5分,是分数最高的改动,那么我们很明显应该将它应用在1分上,让它变成5分,这样我们可以得到4分的收益。

所以我们首先需要对所有科目的成绩进行排序,再对改动按照改动后的分数进行由大到小排序,将改动后分数最大的改动应用在当前成绩最低的科目上。当所有改动都执行完了或者是改动后的分数比当前分数还要低了的时候,说明已经无法获得收益了,这时算法结束。

s = input()
n, m = int(s.split(' ')[0]), int(s.split(' ')[1])

scores = sorted(map(int, input().split(' ')))
ret = 0

operations = []

for i in range(m):
    line = input()
    operations.append((int(line.split(' ')[0]), int(line.split(' ')[1])))


# 对改动按照改动后的分数倒排
operations = sorted(operations, key=lambda x: x[1], reverse=True)

# idx记录当前的改动
idx = 0
# 记录当前的改动执行的个数
j = 0

for i in range(n):
    # 如果当前的改动已经到数量了
    if j == operations[idx][0]:
        j = 0
        idx += 1

 # 如果所有改动已经执行完了或者是改动之后的分数比当前小
    if idx >= m or scores[i] >= operations[idx][1]:
        ret += sum(scores[i:])
        break

    j += 1
    ret += operations[idx][1]

print(ret)

今日问题

召唤兽问题

有一个游戏里的召唤英雄可以召唤召唤兽,这个英雄技能的冷却时间是1秒。召唤召唤兽需要x点魔法,每秒钟英雄可以回复y点魔法值。已知英雄的魔法值上限是n,在游戏开始时魔法值是满的。请问经过m秒之后,英雄可以召唤出多少只召唤兽?

本题为多组测试数据,给定一个整数t表示测试数据的组数。

- END -