题目
题目链接——0三国游戏 - 蓝桥云课
讲解算法原理
我们可以采用贪心算法。贪心算法的基本思想是在每个决策点都选择当前最优的选项,从而希望得到最终的全局最优解。
在这个问题中,我们可以独立地考虑每个国家可能赢得胜利的情况,并尝试找出使得每个国家士兵数量超过其他两个国家士兵数量之和的最多事件数。对于每个国家,我们都按照使得它的士兵数量相对于其他两个国家的士兵数量增加最多的顺序来选择事件
我们首先对所有事件按照使得该国家士兵数量相对于其他两个国家士兵数量增加的数量进行排序,然后依次选择事件,直到不能找到更多的事件使得该国家的士兵数量超过其他两个国家士兵数量之和为止。
详细步骤
-
输入事件数量 nn 和每个事件增加的士兵数量。
-
对于每个国家,我们都按照使得该国家士兵数量相对于其他两个国家士兵数量增加的数量进行排序。对于国家 XX,我们按照 Ai−Bi−CiAi−Bi−Ci 的顺序对事件进行排序,对于国家 YY,我们按照 Bi−Ai−CiBi−Ai−Ci 的顺序对事件进行排序,对于国家 ZZ,我们按照 Ci−Ai−BiCi−Ai−Bi 的顺序对事件进行排序。
-
对于每个国家,我们依次选择事件,直到不能找到更多的事件使得该国家的士兵数量超过其他两个国家士兵数量之和为止。具体来说,对于国家 XX,我们依次选择事件,累计增加的士兵数量,如果在某个时刻,国家 XX 的士兵数量超过国家 YY 和国家 ZZ 的士兵数量之和,我们就记录下当前的事件数量,然后停止选择事件。对于国家 YY 和国家 ZZ,我们也进行相同的操作。
-
对于每个国家,我们都可以得到一个最多事件数,然后我们选择这三个数中的最大值作为答案。如果所有的最多事件数都是 −1−1,那么我们就输出 −1−1,表示找不到让任一国家士兵数量超过其他两个国家士兵数量之和的事件序列。
这种方法的正确性在于,对于每个国家,我们都尽可能地选择使得其士兵数量相对于其他两个国家士兵数量增加最多的事件,这样可以最大化其可能超过其他两个国家士兵数量之和的事件数,从而最大化我们的目标函数。
解题代码
重新定义排序:从大到小
实现函数
由于单独拎出来解释太苍白,所以我将每行代码后面添加了注释。
最后附上完整代码
以上就是本题的全部解释