又是一个关于位运算的应用

 好吧我想说现在我迷恋上位运算了,凡是某个数只有两种状态的话,我现在都会优先考虑位运算...额废话不多说,上题目.

某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:53现在已知:双方开始时的体力值甲:1000,乙:2000假设战斗中,甲乙获胜的概率都是50%求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。

 

这题实际上用递归会比较好,因为数据规模很小,才是4次.用递归的话很直观也很简洁...但是假设战斗回合值比较大的时候,那么递归的效率就是一个很大的问题了...当然可以一边用一个数组把每次递归的结果记录下来,这样的话效率也会提高一些.但是这样也只能是改善,而递归树的展开,到叶子节点,再回溯,时间开销增长是很快的.

 

因此我们要寻找一种时间开销相对较小的方法.比赛要么胜要么负,这里没有平这样的说法,那么我们用来标记比赛的胜负的话就直接用两个数字就可以表示了.两个数字的话,0,1...开始有点位运算的味道了

这个比赛不仅要考虑胜负关系,还要考虑胜负的前后关系,假设只有两场战斗的情况下1代表甲胜0代表甲负, 那不就相当于拿0和1去填充两个位置那么我们可以得到00 01 10 11么,这几个不就相当于十进制的0 1 2 3嘛.而0 1 2 3 这四个数字和战斗的回合有个简单的关系, 3 = pow(2,2) - 1 而在两场的时候我们需要做的判断就是逐位判断,判断完之后把数右移.那么这样我们就只需要两个循环嵌套起来就能计算所有的可能了.一个循环用于穷举从0到最大的战斗场次,内层循环用于判断最低位的胜负情况,然后右移,这样的话时间复杂度是 n^2较递归来说时间复杂度有了很大的改善,额啰嗦那么多,最后附上代码吧 若有错误请指出

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值