bzoj 4008: [HNOI2015]亚瑟王
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]亚瑟王的更多相关文章
- BZOJ 4008: [HNOI2015]亚瑟王( dp )
dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...
- ●BZOJ 4008 [HNOI2015]亚瑟王
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4008题解: 概率dp,神仙题 如果我们可以求出每种牌被取到的概率f,那么最后期望造成的伤害也 ...
- BZOJ 4008: [HNOI2015]亚瑟王 [DP 概率 !!!]
传送门 题意: $r$轮$n$张卡牌,每一轮依次考虑每张卡牌,$p_i$概率发动造成$d_i$伤害后结束本轮或者继续考虑下一张 每张卡牌发动过之后以后都会跳过 求$r$轮之后的期望伤害 看了一节课出题 ...
- 4008: [HNOI2015]亚瑟王
4008: [HNOI2015]亚瑟王 链接 分析: 根据期望的线性性,直接求出每张牌出现的概率,最后乘以攻击力就是答案. 每张牌出现的概率只与它前面的牌有关,与后面的没有关系,于是按顺序考虑每张牌. ...
- 【BZOJ】4008: [HNOI2015]亚瑟王
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4008 这题主要在于:先算概率,再算期望! 一轮一轮的计算似乎很复杂,每一轮它其实是可以看作 ...
- bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望
[bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...
- 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)
[BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...
- 【BZOJ4008】[HNOI2015]亚瑟王
[BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...
- 【BZOJ4008】[HNOI2015]亚瑟王 期望
[BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...
随机推荐
- 【转载】NetFPGA-1G-CML从零开始环境配置
##环境 深度Linux ###环境配置 ```bash sudo apt-get install libsigc++ sudo apt-get install qgit sudo apt-get i ...
- VS Code 常用命令记录
1. 创建解决方案 例:dotnet new sln -o HelloWorld.Solutions 其中 -o 表示输出文件夹 2.创建类库.web.mvc.webapi等项目 例:dotnet n ...
- 偶遇vue-awesome-swiper的坑
最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...
- float、absolute、inline-block三者区别
0.前言 float属性在css2中是一个热门的属性,被广泛应用于布局之中,同时由于不当使用float带来的问题也非常多,本文结合自己对float的理解以及实际项目中碰到float的相关问题,做一个详 ...
- 【Fungus入门】10分钟快速构建Unity中的万能对话系统 / 叙事系统 / 剧情系统
我真的很久没有写过一个完整的攻略了(笑),咸鱼了很久之后还是想来写一个好玩的.这次主要是梳理一下Unity的小众插件Fungus的核心功能,并且快速掌握其使用方法. 官方文档:http://fungu ...
- 让linux远程主机在后台运行脚本
后台挂起:python xxx.py & 在脚本命令后面加入"&"符号就可以后台运行.结束进程:kill -9 sidps -ef | grep ... 查询sid
- 在网络编程中的io流小问题
在客户端和服务端调用io流进行传输数据的过程中,当将数据write到outputstream中,需要及时刷新,否则会发生io阻塞. 在输入数据的时候,最好选用BufferedReader,因为read ...
- Python机器学习—导入各种数据的N种办法
pandas 读取数据 一.导入一般的文件 1.read_csv(),用来读取CSV文件 官方文档是这么说的:Read CSV (comma-separated) file into DataFram ...
- JaveScript内置对象(JS知识点归纳八)
1)JS自身提供的方式 用于对数据进行简便的操作,根据方法可以操作的数据类型不同,形成了不同的对象--内置对象 2)数组 a)基本操作方法--对数组进行修改 从数组最后进行操作 1)数组.push ...
- LeetCode & Q27-Remove Element-Easy
Array Two Pointers Description: Given an array and a value, remove all instances of that value in pl ...