有一款游戏,里面有N个游戏玩家 (1<=N<100000),每个玩家都有一个初始的生命能量值lifePower(0<=lifePower<=231−1)
游戏规则:经过多玩家1对1 PK 直到游戏结束,每一轮PK都是从游戏中尚存的所有玩家中挑选生命能量值最小且不为0的2个玩家进行PK(如果在挑选符合PK条件的2个玩家过程中,能量值相同的候选玩家有多个时,则挑选玩家编号小的玩家参与PK),如是两个玩家的生命能量值相同,则2个玩家同归于尽,生命能量值都归为0,PK后都退出游戏;如果2个玩家的生命能量值不同,则能量值大的玩家胜出,PK过程胜出玩家会消耗掉另一个玩家的同等数量的生命能量值,但是PK胜出后,则剩余生命能量值会膨胀3倍(最大不超过32位有符号整数的最大值即 231−1),即为该玩家最终的生命能量值为剩余生分能量值的3倍。PK胜出的玩家仍可继续游戏;
如果游戏无法挑选出2个符合条件的玩家进行PK时,游戏结束;
请设计一个高效的算法,让游戏按规则进行玩家PK,直到游戏结束。
该问题要求模拟一系列“玩家1对1对战”的过程,每轮选择当前生命值最小且不为0的两名玩家进行PK,直到无法匹配出两名玩家或所有玩家生命值归零。
显然,每轮都要快速地找到当前生命值最小的两名玩家,因此可以使用 优先队列(最小堆) 来维护玩家集合。
(life, id)
为键插入最小堆。