蓝桥杯比武问题
某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的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 }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用