题目描述

小 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 求出这一套卡牌在一局游戏中能造成的伤害的期望值。

输入输出格式

输入格式:

输入文件的第一行包含一个整数 T,代表测试数据组数。 接下来一共 T 组数据。 每组数据的第一行包含两个用空格分开的整数 n和r,分别代表卡牌的张数和游戏的轮数。 接下来 n行,每行包含一个实数和一个整数,由空格隔开,描述一张卡牌。第i 行的两个数为 pi和 di,分别代表第 i 张卡牌技能发动的概率(实数)和技能发动造成的伤害(整数)。保证 pi最多包含 4位小数,且为一个合法的概率。

输出格式:

对于每组数据,输出一行,包含一个实数,为这套卡牌在这一局游戏中造成的伤害的期望值。对于每一行输出,只有当你的输出和标准答案的相对误差不超过10^-8时——即|a-o|/a<=10-8时(其中a是标准答案,o是输出),你的输出才会被判为正确。建议输出10 位小数。

题意:
       开始有n张牌,每张牌牌有伤害值di,发动的概率pi,进行r轮这样的操作:从头开始考虑每一张牌,如果第i张牌已经被选,跳过;否则有pi的概率选取它并且结束这个操作(存在一轮之后并未选牌的情况);

题解:
     ①分析题的话,对于一个确定的n,第i张牌发动的概率和d无关,先统计概率,再乘以权值就是期望了。

     ②定义状态f[i,j] 为到第i张牌时,有r-j次选了1->i-1之间的牌,还有j次机会去选后面i+1->n的牌的概率;

     ③转移的话,如果选了第i-1张(每张牌最多只能被选一次)  

$$f[i][j] = f[i-1][j+1]*(1-(1-p[i-1])^{j+1})$$

如果并没有选第i-1张牌

$$f[i][j] = f[i-1][j]*(1-p[i-1])^{j}$$

     ④最后统计答案把每一个i的所有概率之和乘di累加即可;

     (关键在于状态的定义)

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
const int N=1000;
int T,n,r,d[N];
double p[N];
double dp[N][N];
double pw(double x,int y){
double res = 1.0;
while(y){
if(y&1) res*=x;
y>>=1; x*=x;
}
return res;
}
int main()
{ freopen("bzoj4008.in","r",stdin);
freopen("bzoj4008.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&r);
for(int i = 1;i <= n;i++)scanf("%lf%d",&p[i],&d[i]);
double ans = 0.0; memset(dp,0,sizeof(dp)); dp[0][r] = 1.0;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= r;j++){
dp[i][j] = dp[i-1][j] * pw(1-p[i-1],j) + dp[i-1][j+1] * (1 - pw(1-p[i-1],j+1));
ans += dp[i][j] * (1 - pw(1 - p[i],j)) * d[i];
}
printf("%.10lf\n",ans);
}
return 0;
}//by tkys_Austin;

  

 

【bzoj4008 hnoi2015】 亚瑟王的更多相关文章

  1. 概率DP——BZOJ4008 [HNOI2015]亚瑟王

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

  2. Bzoj4008 [HNOI2015]亚瑟王

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 1009  Solved: 605[Submit][Status] ...

  3. BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...

  4. BZOJ4008: [HNOI2015]亚瑟王(期望dp)

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 1952  Solved: 1159[Submit][Status] ...

  5. BZOJ4008 [HNOI2015]亚瑟王 【概率dp】

    题目链接 BZOJ4008 题解 要求所有牌造成伤害的期望,就是求每一张牌发动的概率\(g[i]\) 我们发现一张牌能否发动,还与其前面的牌是否发动有关 那我们设\(f[i][j]\)表示前\(i\) ...

  6. bzoj4008: [HNOI2015]亚瑟王【期望dp】

    一个特别神奇的dp,特别厉害. f(i, j) 表示 有 j 轮发动技能的牌在 [1, i] 另外的m - j轮在[i + 1, n]之间的概率. 怎么转移呢? 首先考虑i这张牌不选的情况,f(i - ...

  7. BZOJ4008 : [HNOI2015]亚瑟王(期望dp)

    题意 略(看了20min才看懂...) 题解 我一开始天真地一轮轮推期望,发现根本不好算... 唉~ 不会做就只能抄题解咯 看了一波DOFY大佬的解法qwq 发现有句神奇的话 记住,期望要倒着推... ...

  8. bzoj4008: [HNOI2015]亚瑟王 dp

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4008 思路 神仙啊 \(f[i][j]表示第i个点有j次机会(不管成功与否)\) \(f ...

  9. 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)

    传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...

  10. 【文文殿下】[BZOJ4008] [HNOI2015] 亚瑟王

    题解 这是一个经典的概率DP模型 设\(f_{i,j}\)表示考虑到前\(i\)张牌,有\(j\)轮没打出牌的可能性,那么显然\(f_{0,r} = 1\). 考虑第\(i+1\)张牌,他可能在剩下的 ...

随机推荐

  1. java web 初学

    我希望在本学期本堂课上学会使用java web 框架 精通mvc架构模式 学会通过框架和数据库对产品进行构造与编写. 我计划每周用16小时的时间进行学习java web 一周4学时上课时间 周一到周五 ...

  2. io多路复用(二)

    服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() inputs = [sk1,] i ...

  3. Java面试题合集(一)

    接下来几篇文章准备系统整理一下有关Java的面试题,分为基础篇,javaweb篇,框架篇,数据库篇,多线程篇,并发篇,算法篇等等,陆续更新中. 其他方面如前端后端等等的面试题也在整理中,都会有的. 所 ...

  4. datable转xml

    /// <summary> /// datatable转换xml /// </summary> /// <param name="xmlDS"> ...

  5. HTTP与私有二进制协议之间的区别

    简单的文本协议.二进制协议 写网络程序躲不过协议,协议其实就是定义了消息的格式,以及消息是如何交换的.协议可简单可复杂,复杂精密如TCP协议,简单奔放如HTTP的协议.这里将我所接触到的协议稍微总结一 ...

  6. 新概念英语(1-109)A Good Idea

    Lesson 109 A good idea 好主意 Listen to the tape then answer this question. What does Jane have with he ...

  7. SpringCloud的Config:ConfigServer注册到EurekaServer中,变成一个Eureka服务

    一.概念与定义 1.将SpringCloud ConfigServer注册到 EurekaServer,以便ConfigClient以服务的方式引用ConfigServer 2.客户端不再引用 Con ...

  8. 前端开发必备之Chrome开发者工具(一)

    本文介绍的 Chrome 开发者工具基于 Chrome 65版本,如果你的 Chrome 开发者工具没有下文提到的那些内容,请检查下 Chrome 的版本 简介 Chrome 开发者工具是一套内置于 ...

  9. React-Native(四):React Native之View学习

    React Native实现以下布局效果:携html5(http://m.ctrip.com/html5/) 基于HelloWord修改项目代码: /** * Sample React Native ...

  10. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...