【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

4832: [Lydsy2017年4月月赛]抵制克苏恩

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 275  Solved: 87

Description

小Q同学现在沉迷炉石传说不能自拔。他发现一张名为克苏恩的牌很不公平。如果你不玩炉石传说,不必担心,小Q

同学会告诉你所有相关的细节。炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌

召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力。小Q同学有很多次游戏失败都是

因为对手使用了克苏恩这张牌,所以他想找到一些方法来抵御克苏恩。他去求助职业炉石传说玩家椎名真白,真白

告诉他使用奴隶主这张牌就可以啦。如果你不明白我上面在说什么,不必担心,小Q同学会告诉你他想让你做什么

。现在小Q同学会给出克苏恩的攻击力是 K ,表示克苏恩会攻击 K 次,每次会从对方场上的英雄和随从中随机选

择一个并对其产生 1 点伤害。现在对方有一名克苏恩,你有一些奴隶主作为随从,每名奴隶主的血量是给定的。

如果克苏恩攻击了你的一名奴隶主,那么这名奴隶主的血量会减少 1 点,当其血量小于等于 0 时会死亡,如果受

到攻击后不死亡,并且你的随从数量没有达到 7 ,这名奴隶主会召唤一个拥有 3 点血量的新奴隶主作为你的随从

;如果克苏恩攻击了你的英雄,你的英雄会记录受到 1 点伤害。你应该注意到了,每当克苏恩进行一次攻击,你

场上的随从可能发生很大的变化。小Q同学为你假设了克苏恩的攻击力,你场上分别有 1 点、 2 点、 3 点血量的

奴隶主数量,你可以计算出你的英雄受到的总伤害的期望值是多少吗?

Input

输入包含多局游戏。

第一行包含一个整数 T (T<100) ,表示游戏的局数。

每局游戏仅占一行,包含四个非负整数 K, A, B 和 C ,表示克苏恩的攻击力是 K ,你有 A 个 1 点血量的奴隶

主, B 个 2 点血量的奴隶主, C 个 3 点血量的奴隶主。

保证 K 是小于 50 的正数, A+B+C 不超过 7 。

Output

对于每局游戏,输出一个数字表示总伤害的期望值,保留两位小数。

Sample Input

1

1 1 1 1

Sample Output

0.25

HINT

Source

鸣谢Tangjz提供试题

【分析】

  一个非常显然的状态表示f[i][a][b][c],表示还剩多少轮,1滴血a个,2滴血b个,3滴血c个的期望。

  然后我打的是函数版的。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 bool vis[60][10][10][10];
 9 double f[60][10][10][10];
10
11 double ffind(int k,int a,int b,int c)
12 {
13     if(k==0||a<0||b<0||c<0) return 0;
14     if(vis[k][a][b][c]) return f[k][a][b][c];vis[k][a][b][c]=1;
15     f[k][a][b][c]=0;
16     int s=a+b+c+1;
17     if(a+b+c<7) f[k][a][b][c]+=1.0*c/s*ffind(k-1,a,b+1,c),
18                 f[k][a][b][c]+=1.0*b/s*ffind(k-1,a+1,b-1,c+1);
19     else f[k][a][b][c]=1.0*c/s*ffind(k-1,a,b+1,c-1),f[k][a][b][c]+=1.0*b/s*ffind(k-1,a+1,b-1,c);
20     f[k][a][b][c]+=1.0*a/s*ffind(k-1,a-1,b,c);
21     f[k][a][b][c]+=1.0/s*(ffind(k-1,a,b,c)+1);
22     return f[k][a][b][c];
23 }
24
25 int main()
26 {
27     int T;
28     scanf("%d",&T);
29     while(T--)
30     {
31         int k,a,b,c;
32         scanf("%d%d%d%d",&k,&a,&b,&c);
33         // memset(vis,0,sizeof(vis));
34         for(int i=0;i<=k;i++) for(int j=0;j<=7;j++) for(int jj=0;jj<=7-j;jj++) for(int jjj=0;jjj<=7-j-jj;jjj++) vis[i][j][jj][jjj]=0;
35         printf("%.2lf\n",ffind(k,a,b,c));
36     }
37     return 0;
38 }

2017-04-25 07:36:43

时间: 2024-10-04 20:38:20

【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)的相关文章

【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp

打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并加和,一开始我用的期望忘了转移的时候不能用1而要用概率...... #include <cstdio> #include <cstring> #define r register using namespace std; typedef long double LD; inline i

4832: [Lydsy2017年4月月赛]抵制克苏恩]【解题报告】

戳我 4832: [Lydsy2017年4月月赛]抵制克苏恩 时间限制: 1 Sec  内存限制: 128 MB提交: 752  解决: 289[提交][][] 题目描述 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力.小Q同学有很多次游戏失败都是 因为对手使用

[Lydsy2017年4月月赛]抵制克苏恩

[Lydsy2017年4月月赛]抵制克苏恩 时间限制: 1 Sec  内存限制: 128 MB提交: 49  解决: 34[提交][状态][讨论版] 题目描述 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力.小Q同学有很多次游戏失败都是因为对手使用了克苏恩这张牌,所

[Lydsy2017年4月月赛]抵制克苏恩题解

考试的时候以为就是简单的概率期望题,考完后知道是简单的概率期望DP题,完美爆零. 这道题数据范围很小,很容易让人想到状压,不过貌似没什么可压的.那么只能说明这道题复杂度很高了,状态数组f[o][i][j][k]为第o次攻击后出现有i个1滴血的j个2滴血的,k个3滴血的情况的概率.那么转移方程就明了了. 1.f[o][i][j][k]+=f[o-1][i][j][k]/(i+j+k+1)英雄收到攻击 2.f[o][i][j][k]+=f[o-1][i+1][j][k]*(i+1)/(i+j+k+2

BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩

传送门 题目大意: 攻击k次,每次可攻击随从或英雄. 随从数不大于7个,且1滴血的a个,2滴b个,3滴c个. 攻击一次血-1,如果随从没死可以生成3滴血随从一个 题解: 概率/期望dp f[i][j][p][q]表示攻击i次,一滴血的有j个,二滴血的有p个,三滴血的有q个. 转移就是枚举打在谁身上 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int t,a,

【bzoj4832】[Lydsy1704月赛]抵制克苏恩 期望dp

Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力.小Q同学有很多次游戏失败都是 因为对手使用了克苏恩这张牌,所以他想找到一些方法来抵御克苏恩.他去求助职业炉石传说玩家椎名真白,真白 告诉他使用奴隶主这张牌就可以啦.如果你不明白我上面在说什么

BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4884 [题目大意] 太空猫(SpaceCat)是一款画面精致.玩法有趣的休闲游戏, 你需要控制一只坐在迷你飞碟上的猫咪在太空里不断探索,让大家看看你能飞得多远. 游戏地图可以看成一个二维的网格图,上下是两段障碍物. 在游戏的一开始,太空猫位于地图最左边的下边界之上,且重力方向向下. 在每个时刻,你可以用手指点击屏幕,翻转重力的方向, 或者通过遥感控制太空猫往左或往右移动.每次翻转重力

[BZOJ 4832][lydsy 4月赛] 抵制克苏恩

题面贴一发 [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 443  Solved: 164[Submit][Status][Discuss] Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击

bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT

4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MB Description 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) 使得 a_i  opt b_j=c . Input 第一行是一个整数 T (1≤T≤10) ,表示测试数据的组数. 对于每组测试数据: 第一行是三个整数 n,m,q (