[HNOI2015]亚瑟王
题面在这里
题意
\(n\)张卡按照一定顺序排列,每轮从第\(1\)张开始考虑到最后一张,考虑一张卡时有\(p[i]\)的概率产生\(d[i]\)的贡献,产生贡献时直接退出该轮并在之后的考虑中直接跳过,若不产生贡献继续考虑下一张直到产生贡献或所有牌被考虑完时结束该轮,求期望贡献。多组数据,\(T<=444\)。
sol
刚了整整一下午还是看了题解(膜拜秒切的大佬orz)
如果直接按照轮数来DP的话每张牌无论是产生贡献的时间还是顺序都需要考虑,原地爆炸
所以考虑每一张牌对答案产生的贡献
而其实第\(i\)张牌在\(r\)轮中产生贡献的概率只和前\(i-1\)张牌在\(r\)轮中产生贡献的数量(假设为\(j\))有关
因为无论这\(j\)张牌产生贡献的时间和顺序怎样变化,最后都一定会有\((r-j)\)轮考虑到第\(i\)张牌
如果设前\(i-1\)张牌在\(r\)轮中\(j\)张产生贡献的概率为\(f[i-1][j]\),那么第\(i\)张牌产生贡献的概率(假设为\(g[i]\))就可以计算了:$$g[i]=\sum_{j=0}{min(i,r)}{f[i-1][j]*(1-(1-p[i]){r-j})}$$
最后$$Ans=\sum_{i=1}^{n}{(g[i]*d[i])}$$
那么\(f[i][j]\)怎么计算呢? 从前往后递推:$$f[i][j]=f[i-1][j]*(1-p[i]){r-j}[j<=i-1]+f[i-1][j-1]*(1-(1-p[i]){r-j+1})[j>0]$$
代码
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define pb push_back
#define RG register
#define il inline
using namespace std;
const int mod=1e9+7;
const int N=225;
const int R=135;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
}
int T,n,r,d[N];
dd p[N],pw[N][R];
il void init(int n,int r){
for(RG int i=1;i<=n;i++){
dd s=1-p[i];pw[i][0]=1;
for(RG int j=1;j<=r;j++)
pw[i][j]=pw[i][j-1]*s;
}
}
dd f[N][N];
il void DP(){
f[0][0]=1;
for(RG int i=1;i<=n;i++)
for(RG int j=0;j<=min(i,r);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]);
}
}
il void solve(){
RG dd ans=0;
for(RG int i=1;i<=n;i++){
RG dd sum=0;
for(RG int j=0;j<=min(i-1,r);j++)
sum+=(1-pw[i][r-j])*f[i-1][j];
ans+=sum*d[i];
}
printf("%.10lf\n",ans);
}
int main()
{
T=read();
while(T--){
n=read();r=read();
for(RG int i=1;i<=n;i++)scanf("%lf%d",&p[i],&d[i]);
init(n,r);DP();solve();
}
return 0;
}
[HNOI2015]亚瑟王的更多相关文章
- 【BZOJ4008】[HNOI2015]亚瑟王 期望
[BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...
- BZOJ 4008: [HNOI2015]亚瑟王( dp )
dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...
- 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)
[BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- 4008: [HNOI2015]亚瑟王
4008: [HNOI2015]亚瑟王 链接 分析: 根据期望的线性性,直接求出每张牌出现的概率,最后乘以攻击力就是答案. 每张牌出现的概率只与它前面的牌有关,与后面的没有关系,于是按顺序考虑每张牌. ...
- Luogu_3239 [HNOI2015]亚瑟王
Luogu_3239 [HNOI2015]亚瑟王 vim-markdown 真好用 这个题难了我一下午 第一道概率正而八经\(DP\),还是通过qbxt讲解才会做的. 发现Sengxian真是个dal ...
- 【BZOJ4008】[HNOI2015]亚瑟王
[BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...
- bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望
[bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...
- 概率DP——BZOJ4008 [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...
- Bzoj4008 [HNOI2015]亚瑟王
Time Limit: 20 Sec Memory Limit: 512 MBSec Special Judge Submit: 1009 Solved: 605[Submit][Status] ...
随机推荐
- R语言-主成分分析
1.PCA 使用场景:主成分分析是一种数据降维,可以将大量的相关变量转换成一组很少的不相关的变量,这些无关变量称为主成分 步骤: 数据预处理(保证数据中没有缺失值) 选择因子模型(判断是PCA还是EF ...
- 练手项目:利用pygame库编写射击游戏
本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...
- MySQL复制同一个服务器的表结构和表数据
例如,现在服务器上有数据库 dbx 和 dby,dbx中有很多表,要把dbx中的表全部复制到dby,如下操作: 首先: use dby; [复制表结构] CREATE TABLE user LIKE ...
- session垃圾回收机制
主要有以下三个参数 session.gc_maxlifetime:session生命周期 session.gc-devisor:启动session回收机制频率的被除数(分母) session.gc_p ...
- 微信开发系列——微信订阅号前端开发利器:WeUI
前言:年前的两个星期,学习了下微信公众号的开发.后端基本能够基于盛派的第三方sdk能搞定大部分事宜.剩下的就是前端了,关于手机端的浏览器的兼容性,一直是博主的一块心病,因为博主一直专注于bootstr ...
- ubuntu终端常用命令及solarized配色(护眼)
ubuntu终端常用命令及solarized配色(护眼) ubuntu 终端 命令 1.常用命令 ctrl + l - 清屏 . cLear ctrl + c - 终止命令. ctrl + d ...
- 树莓派系列教程:1.环境与系统,无显示器无键盘无网线联网并使用PuTTy与VNC图形界面远程登录
本文所需物品清单: Raspberry Pi 3 Model B 主板.SD卡与读卡器(用于烧录系统) 资料整理来源在文尾 需要下载的资源与工具: 推荐系统-Raspbian 树莓派官方深度定制的硬件 ...
- iOS中蓝牙的使用
Core Bluetooth的使用 1,建立中心设备 2,扫描外设(Discover Peripheral) 3,连接外设(Connect Peripheral) 4,扫描外设中的服务和特征(Disc ...
- 用Putty通过SSH访问Linux服务器
1,sudo apt-get install ssh 2,sudo service ssh restart 3,重启ssh成功后,就可以直接用Putty访问服务器.
- PHP结合Redis来限制用户或者IP某个时间段内访问的次数
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); //获取客户端真实ip地址 function get_real_ip(){ s ...