SpellCards
作者:高杰
关键词:鸽巢原理 动态规划 背包
题目简述
有张符卡排成一个队列,每张符卡有两个属性,等级和伤害。
你可以做任意次操作,每次操作为以下二者之一:
把队首的符卡移动到队尾。
使用队首的符卡,对敌人造成点伤害,并丢弃队首的张符卡(包括你所使用的符卡)。如果队列不足张符卡那么你不能使用。
求出造成的伤害的总和的最大值。
数据范围
算法一
首先由于第一种操作的存在,我们把它转化成一个环上的问题,并删去第一种操作。
接下来我们证明一个结论:
设为一个符卡的集合,则存在一个方案能够使用中所有符卡的充要条件为
必要性是显然的。由于使用一张符卡会使场上的符卡数减少,因此使用的符卡的之和不可能大于,否则将存在一个时刻使场上的符卡数为负。
充分性是比较显然的。我们使用归纳法证明它:
首先,若为空,则结论是显然的。
若不为空,我们将中的符卡在环上标记出来,按顺时针方向的顺序编号,把他们的值记为,到下一张中的符卡的距离记为。注意到有和成立,根据鸽巢原理存在一个使得,那么我们使用这张符卡不会丢弃任何内的其它符卡,从而将的规模缩小了。
证明了这个结论,原题就变成了
求一个符卡的集合,满足且最大。
这是一个典型的01背包问题,可以用朴素的动态规划解决。