zoukankan      html  css  js  c++  java
  • 蓝桥杯比武问题

      某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的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 }
  • 相关阅读:
    窗体1打开窗体2的方法
    C#中窗体间传递数据的几种方法(转载)
    只读字段和常量
    Datepicker控件
    .NET中的加密和解密
    ASP.NET网页生命周期事件
    hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)
    我的第一次博客
    弹性布局
    HTML标签部分(块级/行级)
  • 原文地址:https://www.cnblogs.com/hxsyl/p/3045951.html
Copyright © 2011-2022 走看看