Description

小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑。

他决定,在脱坑之前,最后再来打一盘亚瑟王。既然是最后一战,就一定要打得漂

亮。众所周知,亚瑟王是一个看脸的游戏,技能的发动都是看概率的。作为一个非

洲人,同时作为一个前 OIer,小 K 自然是希望最大化造成伤害的期望值。但他已

经多年没写过代码,连 Spaly都敲不对了,因此,希望你能帮帮小 K,让他感受一

下当欧洲人是怎样的体验。

本题中我们将考虑游戏的一个简化版模型。

玩家有一套卡牌,共 n张。游戏时,玩家将 n 张卡牌排列成某种顺序,排列后

将卡牌按从前往后依次编号为 1 ~ n。本题中,顺序已经确定,即为输入的顺序。

每张卡牌都有一个技能。第 i 张卡牌的技能发动概率为 pi,如果成功发动,则会对

敌方造成di点伤害。也只有通过发动技能,卡牌才能对敌方造成伤害。基于现实因

素以及小K非洲血统的考虑,pi不会为 0,也不会为 1,即 0 < pi < 1。

一局游戏一共有 r 轮。在每一轮中,系统将从第一张卡牌开始,按照顺序依次

考虑每张卡牌。在一轮中,对于依次考虑的每一张卡牌:

1如果这张卡牌在这一局游戏中已经发动过技能,则

1.1 如果这张卡牌不是最后一张,则跳过之(考虑下一张卡牌);

否则(是最后一张),结束这一轮游戏。

2否则(这张卡牌在这一局游戏中没有发动过技能),设这张卡牌为第 i 张

2.1将其以 pi的概率发动技能。

2.2如果技能发动,则对敌方造成 di点伤害,并结束这一轮。

2.3如果这张卡牌已经是最后一张(即 i 等于n),则结束这一轮;否则,

考虑下一张卡牌。

请帮助小 K 求出这一套卡牌在一局游戏中能造成的伤害的期望值。

解题报告:

这题用到了期望的线性性质,即 \(E(xy)=E(x)+E(y)\)

那么这样就可以转化为求出每一张牌的使用概率,最后乘上该牌的伤害值即可

考虑如何求使用的概率:

定义\(f[i][j]\)表示前i张牌,有j张牌用在了i之前,那么对于第i张牌就有打或不打两种转移:

\(f[i][j]=f[i-1][j]*(1-q[i])^{r-j}\)

\(f[i][j]=f[i-1][j-1]*(1-(1-q[i])^{r-j})\)

因为有j张牌打在i之前,所以与i无关,剩下的r-j张牌如果不打在i上,那么每一回合i就贡献\((1-q[i])\),所以乘上\((1-q[i])^{r-j}\)

最后i使用的概率\(v[i]=\sum_{j=0}^{m}f[i-1][j]*(1-(1-q[i])^{r-j})\)

这样累加可以保证i必然打出

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=225;
double p[N],f[N][N],t[N][N],v[N];int n,m,d[N];
void work()
{
memset(f,0,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lf%d",&p[i],&d[i]);
}
for(int j=1;j<=n;j++){
t[j][0]=1;
for(int i=1;i<=m;i++)t[j][i]=t[j][i-1]*(1-p[j]);
}
f[1][0]=t[1][m];f[1][1]=1-t[1][m];v[1]=1-t[1][m];
for(int i=2;i<=n;i++){
v[i]=0;
for(int j=0,tmp=Min(m,i);j<=tmp;j++){
v[i]+=f[i-1][j]*(1.0-t[i][m-j]);
f[i][j]+=f[i-1][j]*t[i][m-j];
if(j)f[i][j]+=f[i-1][j-1]*(1.0-t[i][m-j+1]);
}
}
double ans=0;
for(int i=1;i<=n;i++){
ans+=d[i]*v[i];
}
printf("%.10lf\n",ans);
} int main()
{
int T;cin>>T;
while(T--)work();
return 0;
}

bzoj 4008: [HNOI2015]亚瑟王的更多相关文章

  1. BZOJ 4008: [HNOI2015]亚瑟王( dp )

    dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...

  2. ●BZOJ 4008 [HNOI2015]亚瑟王

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4008题解: 概率dp,神仙题 如果我们可以求出每种牌被取到的概率f,那么最后期望造成的伤害也 ...

  3. BZOJ 4008: [HNOI2015]亚瑟王 [DP 概率 !!!]

    传送门 题意: $r$轮$n$张卡牌,每一轮依次考虑每张卡牌,$p_i$概率发动造成$d_i$伤害后结束本轮或者继续考虑下一张 每张卡牌发动过之后以后都会跳过 求$r$轮之后的期望伤害 看了一节课出题 ...

  4. 4008: [HNOI2015]亚瑟王

    4008: [HNOI2015]亚瑟王 链接 分析: 根据期望的线性性,直接求出每张牌出现的概率,最后乘以攻击力就是答案. 每张牌出现的概率只与它前面的牌有关,与后面的没有关系,于是按顺序考虑每张牌. ...

  5. 【BZOJ】4008: [HNOI2015]亚瑟王

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 这题主要在于:先算概率,再算期望! 一轮一轮的计算似乎很复杂,每一轮它其实是可以看作 ...

  6. bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望

    [bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...

  7. 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)

    [BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...

  8. 【BZOJ4008】[HNOI2015]亚瑟王

    [BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...

  9. 【BZOJ4008】[HNOI2015]亚瑟王 期望

    [BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...

随机推荐

  1. MSSQL 2000 错误823恢复案例

    一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...

  2. Winserver+Apache+django部署

    废话不多说,干活直接上. winserver2012 + django2.0.1 + apache 部署过程 python ==> 3.4 64位 https://www.python.org/ ...

  3. C# HttpClient设置cookies的两种办法 (转发)

    一般有两种办法 第一种handler.UseCookies=true(默认为true),默认的会自己带上cookies,例如 var handler = new HttpClientHandler() ...

  4. 实现GridControl行动态改变行字体和背景色

    需求:开发时遇到一个问题, 需要根据GridControl行数据不同,实现不同的效果 在gridView的RowCellStyle的事件中实现,需要的效果 private void gridView1 ...

  5. 我做的python常用的小技巧

    在python编码过程中,总会遇到各种各样的小问题,我想着记录下来,以备查用,总结过去,是为了更好的思考与进步. 一. 去除变量中(标题中)多余的字符 数据处理过程中,遇到这样的情况: y=['月份' ...

  6. python——函数

    python--函数 1.介绍: 在过去的十年间,大家广为熟知的编程方法无非两种:面向对象和面向过程,其实,无论哪种,都是一种编程的规范或者是如何编程的方法论.而如今,一种更为古老的编程方式:函数式编 ...

  7. Docker学习(1)安装

    1. Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...

  8. [转]scrapy中的logging

    logging模块是Python提供的自己的程序日志记录模块. 在大型软件使用过程中,出现的错误有时候很难进行重现,因此需要通过分析日志来确认错误位置,这也是写程序时要使用日志的最重要的原因. scr ...

  9. iconfont字体图标和各种CSS小图标

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中:     ...

  10. JS事件练习题

    1.点击按钮连续弹窗5次 <div class="noe"> <div class="noe1" onClick="n()" ...