蓝桥杯真题——三国游戏

题目

题目链接——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,表示找不到让任一国家士兵数量超过其他两个国家士兵数量之和的事件序列。

这种方法的正确性在于,对于每个国家,我们都尽可能地选择使得其士兵数量相对于其他两个国家士兵数量增加最多的事件,这样可以最大化其可能超过其他两个国家士兵数量之和的事件数,从而最大化我们的目标函数。

解题代码

重新定义排序:从大到小

实现函数

由于单独拎出来解释太苍白,所以我将每行代码后面添加了注释。

最后附上完整代码

以上就是本题的全部解释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值