蓝桥杯比武问题

  某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。

例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5:3

现在已知:双方开始时的体力值甲:1000,乙:2000

假设战斗中,甲乙获胜的概率都是50%

求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int i,j,k;
10     //二进制枚举,需要概率对半
11     double cnt = 0;
12     for(i=0; i<16; i++)
13     {
14         double a = 1000, b = 2000;//写在for内, 
15         for(j=0; j<4; j++)//从0开始 
16         {
17             if((i>>j)&1)
18             {
19                 a -= a/4;
20                 b += a/4;
21             }
22             else
23             {
24                 a += b/4;
25                 b -= b/4;
26             }
27         }
28         if(fabs(a-b)<1000.0)//内层for外 
29                 cnt++;//double 也可以自增 
30     } 
31     cout<<cnt/16.0<<endl;
32     system("pause");
33     return 0;
34 }
 1 #include<stdio.h>
 2 #include<math.h>
 3 #define N 4
 4 double p=0.5;//p表示甲赢的概率是0.5
 5 
 6 double fun(double x, double y, int cur, double k) {
 7     double sum=0;
 8     if(cur==N) {
 9         if(fabs(x-y)<1000)
10             sum+=k;
11         return sum;
12     }
13     sum+=fun(x-x/4,y+x/4,cur+1,k*(1-p));//甲输掉比赛
14     sum+=fun(x+y/4,y-y/4,cur+1,k*p);
15     return sum;//这个必须有,因为当cur!=N时必须也要有返回 
16 }
17 int main() {
18     printf("%lf\n",fun(1000,2000,0,1));
19     return 0;
20 }

 

posted @ 2013-04-26 22:23  加拿大小哥哥  阅读(336)  评论(0编辑  收藏  举报