Codeforces518 D. Ilya and Escalator
传送门:>Here<
题意:有n个人排队做电梯,每个人必须等前面的人全部上了以后才能上。对于每秒钟,有p的概率选择上电梯,(1-p)的概率选择不上电梯。现在问t秒期望多少人上电梯
解题思路:
期望DP。
表示第i秒上了j个人的概率。
,并且都需要初始化。()
这题好像和普通的期望DP不太一样啊,因为f数组设的是概率而不是期望。这样设的话答案就应该是
考虑如何转移:
第i秒的时候不上人:
第i秒的时候上人:
因此对于一般情况:
另外,总共就n个人,如果就需要特判了:
Code
还是边界条件!对于,由于每秒最多上一个人,所以是不可能大于的,要特判一下。
/*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 = 2010; 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,t; double p,f[N][N],cur,ans; int main(){ // freopen(".in", "r", stdin); scanf("%d %lf %d",&n,&p,&t); f[1][1] = p; f[1][0] = 1-p; for(int i = 2; i <= t; ++i){ f[i][0] = f[i-1][0] * (1-p); } for(int i = 2; i <= t; ++i){ for(int j = 1; j <= n; ++j){ if(j > i){ break; } f[i][j] = f[i-1][j]*(1-p) + f[i-1][j-1]*p; } f[i][n] = f[i-1][n] + f[i-1][n-1] * p; } for(int i = 0; i <= n; ++i){ if(i > t) break; ans += f[t][i] * i; } printf("%.8lf", ans); 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最大的设计失误
· 单元测试从入门到精通