题目描述
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值
的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
输入
输出
以小数形式表示概率,保留到小数点后3位。
假如概率是50%,程序应该输出0.500
#include<bits/stdc++.h>
using namespace std;
int main(){
double x=1000,y=2000;
int i,j,temp,count=0;
for(i=0;i<16;i++){//从0000遍历到1111 即讨论16种情况 这里默认1为甲胜
x=1000,y=2000;
for(j=0;j<4;j++){
temp=1;
temp=temp<<j;//temp:0001 0010 0100 1000 //分别表示第一、二、三、四回合胜利
if((i&temp)==temp){
x+=y/4;
y-=y/4;
}
else{
x-=x/4;
y+=x/4;
}
}
if(fabs(x-y)<1000) count++;
}
printf("%.3lf",1.0*count/16);
return 0;
}
关于位运算:https://blog.csdn.net/sinat_35121480/article/details/53510793
(i&temp)==temp的意思:比如i=0010 则temp首先为0001 (i&temp) !=temp,因为第一次是乙获胜,所以乙加分,接下来temp=0010 则(i&temp)==temp,因为第二次是甲获胜,所以甲加分,接下来的0100和1000都是(i&temp) !=temp,所以都是乙加分。
模拟一部分过程:
i temp
0000(表示甲每次都输) 0001 0010 0100 1000 这四种情况都是乙得分
0001(甲赢了第一回合) 0001 0010 0100 1000 这四种情况temp=0001时是甲得分
……
1110(甲赢了第二三四回合) 0001 0010 0100 1000这四种情况temp=0010,0100,1000时甲得分
1111(甲全赢) 0001 0010 0100 1000这四种情况下都是甲得分
本质就是16种情况都讨论一遍