[ZOJ3329] One Person Game
传送门:>出错啦<
题意:有三个骰子,每个骰子分别有面,若三个骰子分别骰到a, b, c则计数器归0,否则计数器加上三个骰子得到的数之和。求计数器达到n及以上所需要骰的次数的期望。
解题思路:
继续期望DP。
表示从i分到达n分所需要骰的次数的期望,因此 答案为
设骰一次(三个骰子之和)骰到分的概率为,的概率即为骰到的概率,只有。另外的累积一下可能性,也除以总可能性就可以了。
由i分转移到i+j分,分别加上相应的概率。并且还要特殊处理计数器清0的情况:清零的可能性乘以0分的期望。于是我们很容易得到方程:
但是注意,是我们要求的答案,怎么反而用来转移了?所以这个方程很不可行……
但是在这个递推式中,除了之外都是已知的,所以我们可以把它看做一个关于一次函数:
并且我们发现系数只与有关,所以
因此可以替换:
因此
特殊的,当时:
也就是
这就是答案
Code
不要先做完再memset了
/*By QiXingzhi*/ #include <cstdio> #include <queue> #define r read() #define Max(a,b) (((a)>(b)) ? (a) : (b)) #define Min(a,b) (((a)<(b)) ? (a) : (b)) using namespace std; typedef long long ll; const int N = 1010; const int INF = 1061109567; inline int read(){ int x = 0; int w = 1; register int c = getchar(); while(c ^ '-' && (c < '0' || c > '9')) c = getchar(); if(c == '-') w = -1, c = getchar(); while(c >= '0' && c <= '9') x = (x << 3) +(x << 1) + c - '0', c = getchar(); return x * w; } int n,a,b,c,k1,k2,k3,T; double p[N],A[N],B[N]; inline void Solve(){ p[0] = (double)1.0 / (double)(k1*k2*k3); for(int k = 3; k <= k1 + k2 + k3; ++k) p[k] = 0.0; // printf("p[0] = %.5lf\n",p[0]); for(int i = 1; i <= k1; ++i){ for(int j = 1; j <= k2; ++j){ for(int k = 1; k <= k3; ++k){ if(i==a && j==b && k==c) continue; p[i+j+k] += 1.0; // printf("P[%d] = %d\n",i+j+k,P[i+j+k]); } } } for(int k = 3; k <= k1+k2+k3; ++k){ p[k] = (double)(p[k]) / (double)(k1*k2*k3); } for(int i = n; i >= 0; --i){ A[i] = 0.0; B[i] = 0.0; } for(int i = n; i >= 0; --i){ for(int j = 3; j <= k1+k2+k3; ++j){ if(i + j > n) continue; A[i] += A[i+j] * p[j]; B[i] += B[i+j] * p[j]; } A[i] += p[0]; B[i] += 1.0; // printf("A[%d] = %.5lf B[%d] = %.5lf\n",i,A[i],i,B[i]); } printf("%.15lf\n", (double)(B[0]) / (double)(1.0 - A[0])); } main(){ // freopen(".in","r",stdin); T = r;a while(T--){ n = r; k1 = r, k2 = r, k3 = r; a = r, b = r, c = r; Solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通