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. 学生ID查询

    var http = require("http"); var server = http.createServer(function(req,res){ //得到url var ...

  2. day-1 用python编写一个简易的FTP服务器

    从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...

  3. JS 转换数据类型

    JavaScript 是一种动态数据类型语言,变量是没有类型的,可以随机赋予任意值,若变量要转换数据类型,有两种办法:隐式转换和显式转换. 隐式转换可转换为字符串(将一个值加上字符串) 数字(在值的前 ...

  4. io文本加密

    文本加密习题 package io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Inpu ...

  5. LeetCode & Q53-Maximum Subarray-Easy & 动态规划思路分析

    Array DP Divide and Conquer Description: Find the contiguous subarray within an array (containing at ...

  6. 剑指offer-第一个只出现一次的字符

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置   解题思路 由于char类型一共有256种可能,所以开辟一个数组ha ...

  7. 深度学习之 GAN 进行 mnist 图片的生成

    深度学习之 GAN 进行 mnist 图片的生成 mport numpy as np import os import codecs import torch from PIL import Imag ...

  8. NATAPP 内网映射,Visual Studio ,C# 实现本地开发微信公众号,本地调试无需服务器

    点击软件安装教程,根据安装教程,注册帐号,下载软件,配置软件.配置完后如下图,途中红色位置免费版本是随机的. 红色位置是自己的映射域名. 打开VS,并且打开项目,右键项目,在web 选项中修改项目UR ...

  9. angular4学习笔记整理(二)angular4的路由使用

    这章说一下angular的路由 先说angular路由怎么引入,一开始new出来的angular项目它路由帮你配好了,但看要看app.module.ts里面 1.首先最上面要引入路由模块 import ...

  10. Mego开发文档 - 数据注释建模

    数据注释建模 Mego框架使用一组约定来基于CLR类来构建模型.您可以指定其他配置来补充或覆盖通过约定发现的内容. 在 Mego 中所有的数据对象必须要有主键.这里需要声明与EF不同的是框架只支持数据 ...