题解

利用期望的线性性,可以把问题转化为求每一个卡牌造成期望的期望值。

然后我们就需要知道每一个卡牌发动技能的概率。

因为当某一张卡牌发动技能时这一轮会结束,这就很难直接计算了。

我们使用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 ;
}

最新文章

  1. Python打包成exe:屡试不爽的cxfreeze!
  2. CentOS下使用Postfix + Dovecot + Dnsmasq搭建极简局域网邮件系统
  3. js 打印星星金字塔
  4. Spring.Scheduling.Quartz 作业的应用(定时任务和循环触发任务)
  5. 仿照jquery封装一个自己的js库(二)
  6. 将具有关联关系的两个表从hibernate查询出来转成json对象时报错
  7. const的全面理解
  8. linux中PHP dirname(__FILE__)路径问题解决
  9. 建立tracert路由列表的方法
  10. CF 369 B. Valera and Contest
  11. jquerymobile知识点三:弹出层popup
  12. Linux IO工具 iotop备择方案iopp
  13. mysql查询字段值为数字
  14. android界面设计之布局管理
  15. [译]Ocelot - Middleware Injection and Overrides
  16. 使用monitor.bat用DDMS查看其它项目的布局
  17. JAVA 平时作业二
  18. Django单表操作
  19. 第七组团队项目——专业课程资源共享平台——需求分析&amp;原型设计
  20. IdentityServer4-主题

热门文章

  1. tcpsock.v2 与 ecocache
  2. stylus 移动端边框1像素问题解决方案
  3. 如何让Jboss的debug在myeclise上运行
  4. 4.AND,OR
  5. Opencv 使用Rect选取与设置窗口ROI
  6. Mysql优化之优化工具profiling
  7. Android源代码解析之(七)--&amp;gt;LruCache缓存类
  8. Qt实战之酷狗音乐
  9. 协议栈处理中的conntrack HASH查找/Bloom过滤/CACHE查找/大包与小包/分层处理风格
  10. 终结者:负载均衡之Nginx(一)