[HNOI2015]亚瑟王(期望+DP)
2024-08-30 18:59:43
题解
利用期望的线性性,可以把问题转化为求每一个卡牌造成期望的期望值。
然后我们就需要知道每一个卡牌发动技能的概率。
因为当某一张卡牌发动技能时这一轮会结束,这就很难直接计算了。
我们使用DP
设dp[i][j]为前i张卡牌在r轮中有j张发动技能的概率
i这张牌发动技能的概率就为sigema(j=1,min(r,i-1))f[i-1][j]*(1-(1-p[i])^(m-j))
然后我们考虑如何转移。
当当前卡牌发动技能,dp[i][j]+=dp[i-1][j-1]*(1-(1-p[i])^(m-j+1))
当当前卡牌不发动技能,dp[i][j]+=dp[i-1][j]*(1-p[i])^(m-j)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int t,n,m;
double p[N],d[N],pw[N][N],dp[N][N],g[N],ans;
int main(){
scanf("%d",&t);
while(t--){
memset(dp,,sizeof(dp));
memset(g,,sizeof(g));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%lf%lf",&p[i],&d[i]);
pw[i][]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
pw[i][j]=pw[i][j-]*(1.0-p[i]);
}
dp[][]=pw[][m];
dp[][]=g[]=1.0-pw[][m];
for(int i=;i<=n;i++)
for(int j=;j<=min(i,m);j++){
if(j!=)dp[i][j]+=(-pw[i][m-j+])*dp[i-][j-];
if(i!=j)dp[i][j]+=pw[i][m-j]*dp[i-][j];
}
for(int i=;i<=n;i++)
for(int j=;j<=min(i-,m);j++){
g[i]+=dp[i-][j]*(1.0-pw[i][m-j]);
}
ans=;
for(int i=;i<=n;i++){
ans+=g[i]*d[i];
}
printf("%.10lf\n",ans);
}
return ;
}
最新文章
- Python打包成exe:屡试不爽的cxfreeze!
- CentOS下使用Postfix + Dovecot + Dnsmasq搭建极简局域网邮件系统
- js 打印星星金字塔
- Spring.Scheduling.Quartz 作业的应用(定时任务和循环触发任务)
- 仿照jquery封装一个自己的js库(二)
- 将具有关联关系的两个表从hibernate查询出来转成json对象时报错
- const的全面理解
- linux中PHP dirname(__FILE__)路径问题解决
- 建立tracert路由列表的方法
- CF 369 B. Valera and Contest
- jquerymobile知识点三:弹出层popup
- Linux IO工具 iotop备择方案iopp
- mysql查询字段值为数字
- android界面设计之布局管理
- [译]Ocelot - Middleware Injection and Overrides
- 使用monitor.bat用DDMS查看其它项目的布局
- JAVA 平时作业二
- Django单表操作
- 第七组团队项目——专业课程资源共享平台——需求分析&;原型设计
- IdentityServer4-主题
热门文章
- tcpsock.v2 与 ecocache
- stylus 移动端边框1像素问题解决方案
- 如何让Jboss的debug在myeclise上运行
- 4.AND,OR
- Opencv 使用Rect选取与设置窗口ROI
- Mysql优化之优化工具profiling
- Android源代码解析之(七)--&;gt;LruCache缓存类
- Qt实战之酷狗音乐
- 协议栈处理中的conntrack HASH查找/Bloom过滤/CACHE查找/大包与小包/分层处理风格
- 终结者:负载均衡之Nginx(一)