「HNOI2015」亚瑟王
传送门
Description
小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑。
他决定,在脱坑之前,最后再来打一盘亚瑟王。既然是最后一战,就一定要打得漂亮。众所周知,亚瑟王是一个看脸的游戏,技能的发动都是看概率的。作为一个非洲人,同时作为一个前 OIer,小 K 自然是希望最大化造成伤害的期望值。但他已经多年没写过代码,连 Spaly 都敲不对了,因此,希望你能帮帮小 K,让他感受一下当欧洲人是怎样的体验。
本题中我们将考虑游戏的一个简化版模型。
玩家有一套卡牌,共 \(n\) 张。游戏时,玩家将 \(n\) 张卡牌排列成某种顺序,排列后将卡牌按从前往后依次编号为 \(1 \sim n\)。本题中,顺序已经确定,即为输入的顺序。
每张卡牌都有一个技能。第 \(i\) 张卡牌的技能发动概率为 \(p_i\),如果成功发动,则会对敌方造成 \(d_i\) 点伤害。也只有通过发动技能,卡牌才能对敌方造成伤害。基于现实因素以及小 K 非洲血统的考虑,\(p_i\) 不会为 0,也不会为 1,即 \(0 < p_i < 1\)。
一局游戏一共有 \(r\) 轮。在每一轮中,系统将从第一张卡牌开始,按照顺序依次考虑每张卡牌。在一轮中,对于依次考虑的每一张卡牌:
- 如果这张卡牌在这一局游戏中已经发动过技能,则
1.1 如果这张卡牌不是最后一张,则跳过之(考虑下一张卡牌); 否则(是最后一张),结束这一轮游戏。- 否则(这张卡牌在这一局游戏中没有发动过技能),设这张卡牌为第 \(i\) 张。
2.1 将其以 \(p_i\) 的概率发动技能。
2.2 如果技能发动,则对敌方造成 \(d_i\)点伤害,并结束这一轮。
2.3 如果这张卡牌已经是最后一张(即 \(i\) 等于 \(n\)),则结束这一轮;否则,考虑下一张卡牌。请帮助小 K 求出这一套卡牌在一局游戏中能造成的伤害的期望值。
Solution
本题想到对于每个卡牌单独求概率并不难
难点在于每轮在取到卡牌后就会停止,所以如果是对游戏过程进行\(dp\)会非常麻烦
因为你可能需要考虑当前以获得卡牌的集合
题解的做法巧妙地排除了这方面的难题,转而对序列本身进行\(dp\)
因为轮数是已知的,并且数列的顺序也是已知的
未知的是每一轮的停止位置,所以本题的\(dp\)实质上是在对每一轮的结束位置进行\(dp\)
设\(dp[i][j]\)表示全局结束后,前\(i\)个中选了\(j\)个的概率,\(f[i]\)表示第\(i\)个被选上的概率,\(p[i]\)表示输入的那个概率。考虑是否选择第\(i\)个数进行转移,并把选择第\(i\)个数的贡献计入\(f[i]\)
Code
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
#define db double
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=225,MR=137;
int n,r,d[MN];
db p[MN],pw[MN][MN],f[MN][MN],P[MN],ans;
int main()
{
int Cas=read();
reg int i,j;
while(Cas--)
{
n=read();r=read();
for(i=1;i<=n;++i)scanf("%lf",&p[i]),d[i]=read();
memset(f,0,sizeof f);
memset(P,0,sizeof P);
reg int i,j;
for(i=1;i<=n;++i)for(pw[i][0]=j=1;j<=r;++j)
pw[i][j]=pw[i][j-1]*(1.-p[i]);
f[1][0]=pw[1][r];f[1][1]=P[1]=1.-f[1][0];
for(i=2;i<=n;++i)for(j=0;j<=r&&j<=i;++j)
{
f[i][j]+=f[i-1][j]*pw[i][r-j];
if(j) f[i][j]+=f[i-1][j-1]*(1-pw[i][r-j+1]),
P[i]+=f[i-1][j-1]*(1-pw[i][r-j+1]);
}
ans=0.;
for(i=1;i<=n;++i)ans+=P[i]*(db)d[i];
printf("%.10lf\n",ans);
}
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
「HNOI2015」亚瑟王的更多相关文章
- loj #2116. 「HNOI2015」开店
#2116. 「HNOI2015」开店 题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的想法当然非 ...
- 「HNOI2015」菜肴制作
「HNOI2015」菜肴制作 这道题想到了其实还挺水的,一开始我直接用小根堆拓扑然后就爆0了,然后我又用十万个堆搜索,T30,还是xkl告诉我要倒着拓扑. 首先要建反图,对于入度为0的点,较小的点先输 ...
- BZOJ 4008 【HNOI2015】 亚瑟王
题目链接:亚瑟王 这道题好神啊TAT--果然我的dp还是太弱了-- 一开始想了半天的直接dp求期望,结果最后WA的不知所云-- 最后去翻了题解,然后发现先算概率,再求期望--新姿势\(get\). 我 ...
- 【bzoj4008 hnoi2015】 亚瑟王
题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...
- LOJ #2116 Luogu P3241「HNOI2015」开店
好久没写数据结构了 来补一发 果然写的时候思路极其混乱.... LOJ #2116 Luogu P3241 题意 $ Q$次询问,求树上点的颜色在$ [L,R]$中的所有点到询问点的距离 强制在线 询 ...
- 【BZOJ4008】【HNOI2015】亚瑟王 [期望DP]
亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 小 K 不慎被 LL 邪教洗脑了,洗 ...
- 「HNOI 2015」亚瑟王
\(Description\) 有\(n\)张卡牌,每一张卡牌有\(p_i\)的概率发动,并造成\(d_i\)点伤害.一共有\(r\)轮,每一轮按照编号从小到大依次考虑,如果这张牌已经发动过则跳过该牌 ...
- [loj2116]「HNOI2015」开店 动态点分治
4012: [HNOI2015]开店 Time Limit: 70 Sec Memory Limit: 512 MBSubmit: 2452 Solved: 1089[Submit][Status ...
- 「HNOI2015」开店(树链剖分, 主席树)
/* 考虑将所求的值拆分 记每个点到根的路径长度为dis_i, 那么我们要求的就是\sum_{i = l} ^ r dis_i + dis[u] * (r - l + 1) - 2\sum_{i = ...
随机推荐
- php批量检查https证书有效期
function get_cert_info($domain){ $context = stream_context_create(['ssl' => [ 'capture_peer_cert' ...
- 【开发笔记】-Ubuntu环境命令初始化
更新apt-get命令 apt-get update 安装yum命令 首先检测是否安装 build-essential 包 sudo apt-get install build-essential 安 ...
- map字典,储存cookie,切换账户,展示购物车不同商品
1:首页 1,静态html5+css做好基本样式 html5,css,jQery, sass 2,jsonp的方式src引入模拟的json数据//这里用的jsonp方式拿数据,详情有使用ajax 遍历 ...
- vim替换字符串
1. s 命令来替换字符串 :s/vivian/sky/ #替换当前行第一个 vivian 为 sky :s/vivian/sky/g #替换当前行所有 vivian 为 sky :n,$s/vivi ...
- sqlite3 FTS全文索引按照相关性排序
PS.后来发现,以下代码并不准确.请大家不要试了. -------以下是原内容------------------------------------------------------------- ...
- (六)Kubernetes Pod控制器-ReplicaSet和Deployment和DaemonSet
Pod控制器相关知识 控制器的必要性 自主式Pod对象由调度器调度到目标工作节点后即由相应节点上的kubelet负责监控其容器的存活状态,容器主进程崩溃后,kubelet能够自动重启相应的容器.但对出 ...
- 如何让自己的Dev C++用上C++11标准
首先确保Dev C++版本是最新的5.11版 其实用C++11标准的语法去运行还是会出现结果的,最多warning一下 但完美主义者是不允许这样的 我们可以点击菜单栏的“工具”->“编译选项”进 ...
- Python决策树可视化:GraphViz's executables not found的解决方法
参考文献: [1]Python决策树可视化:GraphViz's executables not found的解决方法
- Tomcat管理
Tomcat日志 /data/env/tomcat8546/logs/catalina.out echo "" > catalina.out Tomcat配置文件 /data ...
- js延迟加载的性能优化
js的延迟加载有助于提高页面的加载速度,特别是竞价优化站是有一定的好处,今天来说说我是如何优化竞价站打开速度! 案例:http://yzmb.pengchenggroup.cn/ 动态创建DOM方式 ...