亚瑟王

Time Limit: 20 Sec  Memory Limit: 512 MB
[Submit][Status][Discuss]

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

Input

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

Output

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

Sample Input

  1
  3 2
  0.5000 2
  0.3000 3
  0.9000 1

Sample Output

  3.2660250000

  一共有 13 种可能的情况:

  1. 第一轮中,第 1张卡牌发动技能;第二轮中,第 2张卡牌发动技能;
  概率为 0.15,伤害为5。
  2. 第一轮中,第 1张卡牌发动技能;第二轮中,第 3张卡牌发动技能;
  概率为 0.315,伤害为3。
  3. 第一轮中,第 1张卡牌发动技能;第二轮不发动技能;
  概率为 0.035,伤害为2。
  4. 第一轮中,第 2张卡牌发动技能;第二轮中,第 1张卡牌发动技能;
  概率为 0.075,伤害为5。
  5. 第一轮中,第 2张卡牌发动技能;第二轮中,第 3张卡牌发动技能;
  概率为 0.0675,伤害为4。
  6. 第一轮中,第 2张卡牌发动技能;第二轮不发动技能;
  概率为 0.0075,伤害为3。
  7. 第一轮中,第 3张卡牌发动技能;第二轮中,第 1张卡牌发动技能;
  概率为 0.1575,伤害为3。
  8. 第一轮中,第 3张卡牌发动技能;第二轮中,第 2张卡牌发动技能;
  概率为 0.04725,伤害为4。
  9. 第一轮中,第 3张卡牌发动技能;第二轮不发动技能;
  概率为 0.11025,伤害为1。
  10. 第一轮不发动技能;第二轮中,第 1张卡牌发动技能;
  概率为 0.0175,伤害为2。
  11. 第一轮不发动技能;第二轮中,第 2张卡牌发动技能;
  概率为 0.00525,伤害为3。
  12. 第一轮不发动技能;第二轮中,第 3张卡牌发动技能;
  概率为 0.011025,伤害为1。
  13. 第一轮不发动技能;第二轮亦不发动技能;
  概率为 0.001225,伤害为0。
  造成伤害的期望值为概率与对应伤害乘积之和,为 3.266025。

HINT

  对于所有测试数据, 1 <= T <= 444, 1 <= n <= 220, 0 <= r <= 132, 0 < pi < 1, 0 <= di <= 1000。  
  除非备注中有特殊说明,数据中 pi与di均为随机生成。 
  请注意可能存在的实数精度问题,并采取适当措施。 

Main idea

  有n个人,r轮游戏,每次从左到右依次进行操作,第i个人有p[i]的概率被选中,被选中了则产生d[i]贡献,结束该轮,询问期望贡献和。

Solution

  期望DP题,转换思想,把所有的机会一起操作。

  f[i][j]表示到第i个人得到了j个机会的概率,显然,如果i得到j个机会那么i-1也至少得到了j个机会。

  如果i-1没有用机会,那么f[i][j]+=f[i-1][j]*p(i-1一个机会都没用),如果i-1用了机会,那么这轮就停止了,f[i][j]+=f[i-1][j+1]*p(i-1至少用了一个机会),因为事实上也只会算一个用掉的机会,所以是不会使得答案错误的。

Code

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=; int T;
int n,r;
double p[ONE];
int d[ONE];
double f[ONE][ONE];
double Ans; int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} double Quick(double a,int b)
{
double res=1.00;
while(b)
{
if(b&) res=res*a;
a=a*a;
b>>=;
}
return res;
} int main()
{
T=get();
while(T--)
{
Ans=;
memset(f,,sizeof(f));
n=get(); r=get();
for(int i=;i<=n;i++)
{
scanf("%lf",&p[i]);
d[i]=get();
} f[][r]=1.0;
for(int i=;i<=n;i++)
for(int j=;j<=r;j++)
{
f[i][j]+= f[i-][j] * Quick(-p[i-],j);
f[i][j]+= f[i-][j+] * ( - Quick(-p[i-],j+));
Ans+=f[i][j]*( - Quick(-p[i],j))*d[i];
} printf("%lf\n",Ans);
}
}

最新文章

  1. zabbix3.0报错记录
  2. iOS 开发进程与线程
  3. hdu 5693 朋友 博弈
  4. Gradle简介
  5. bootrom启动流程【转】
  6. FishEye简介
  7. asp.net能不托管吗?
  8. JS - 按钮倒计时
  9. Tomcat中Context的配置
  10. 基于Dubbo的分布式事务框架(LCN)
  11. Android View的重绘过程之WindowManager的addView方法
  12. SpringCloud Config客户端
  13. (原创)odoo11配置邮件功能的那些事儿
  14. kafka系列八、kafka消息重复和丢失的场景及解决方案分析
  15. VS2013 编译&amp;使用 stlport
  16. java 设计模式:单例模式
  17. Number常用方法函数
  18. linux系统下安装Jenkins
  19. SQLSERVER 升级版本的方法
  20. SOCKET编程需要注意的问题

热门文章

  1. netty源码分析系列文章
  2. 手把手教你玩转CSS3 3D技术
  3. 【性能调优】一次关于慢查询及FGC频繁的调优经历
  4. 孤荷凌寒自学python第七十三天开始写Python的第一个爬虫3
  5. NO12——快速幂取模
  6. Spring框架(依赖注入)
  7. 搭建springmvc项目没扫描到mapper和service
  8. 【Linux】Linux修改openfiles后不生效问题?
  9. homework for Java
  10. maven第一个HelloWorld