• 蓝桥杯比武问题


      某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的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 }
  • 相关阅读:
    【费用流】【CODEVS】1227 方格取数2
    【CODEVS】1034 家园
    【BZOJ】1066: [SCOI2007]蜥蜴
    【最大流】【CODEVS】1993 草地排水
    【HDU】2191 多重背包问题
    【TYVJ】1520 树的直径
    【BZOJ】1984 月下“毛景树”
    【BZOJ】1588: [HNOI2002]营业额统计
    【NOI】2004 郁闷的出纳员
    【POJ】2892 Tunnel Warfare
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3045951.html
Copyright © 2020-2023  润新知