L3-034 超能力者大赛
知乎上有这样一个话题:“全世界范围内突然出现 666 个超能力者,击败对手就能获得对手的超能力,最终获胜者将如何自处?”
现在让我们来将这个超能力者大赛的规则具体化:给定 N 位超能力者(超能力者从 0 到 N−1 编号,你的编号为 0),分布在全世界 M 座城市中(城市从 0 到 M−1 编号),比赛从第 1 天开始,到第 D 天结束。每位超能力者有一个能力值 Ei(i=0,⋯,N−1)。
如果你的能力值大于等于对手的能力值,就可以将其击败,并且对方的能力值立刻直接累加到你的能力值上。但是,当你每次到达一座城市,击败一位对手后,就会惊动这座城市中所有剩下的超能力者(包括联盟)。这座城市中剩下的所有个体能力值小于等于你的超能力者就会立刻团结起来形成联盟,联盟的能力值等于所有联盟成员能力值的总和。联盟将从此作为一个整体进攻或防御你,你可将联盟等价地理解为一个超能力者,它还可能在后续的战斗中继续与其它弱小的同城选手或联盟合并。第二天,这个城市中任何能力值大于你的对手就会找上门来,而你为了自保,就只能赶紧离开这个城市……
此外,还有如下补充规定:
- 你每天只能进行 1 场战斗,击败一个超能力者(包括联盟),或者被一个能力值大于你的超能力者(包括联盟)击败。
- 比赛中间没有一天可以休息,你或者在战斗,或者在去往另一个城市的路上。
- 当你到达一个城市时,会在到达的第二天进行战斗。
- 当你结束战斗要离开这个城市时,是第二天开始出发。
下面我们为你设计一套贪心算法,就请你验证一下,这个算法能否让你得到这个大赛的冠军。算法步骤很简单:
- 第 1 步:从所有超能力者(包括联盟)中找出一个与自己能力值最接近、同时自己能够击败的对手,用最短时间去到对方的城市,在到达后第二天击败之;
- 第 2 步:如果该城市中没有能力值大于你的超能力者(包括联盟),按照规则逐一击败之;如果该城市中已经没有超能力者、或你第二天没有必胜把握,则回到第 1 步。
重复上述步骤,直到你:
- 击败了所有超能力者;或
- 你已经无路可逃(即剩下的所有超能力者的能力值都大于你);或
- 比赛终止时间到。
第 1 步中