题面贴一发

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

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 443  Solved: 164
[Submit][Status][Discuss]

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

这题是一个比较简单的概率DP,可以开一个四维的$DP$数组$f_{i,j,k,l}$,代表克苏恩第 $i$ 次攻击且当时场上有 $1$ 血奴隶主 $j$ 个, $2$ 血奴隶主 $k$ 个,$3$ 血奴隶主 $l$ 个时英雄收到攻击的概率.转移方式则有四种情况:

若攻击到英雄,则触发转移$f_{i+1,j,k,l}=f_{i,j,k,l} \times \frac {1} {j+k+l+1}$

若攻击到 $1$ 血奴隶主,则触发转移$f_{i+1,j-1,k,l}=f_{i,j,k,l} \times \frac{j} {j+k+l+1}$

若攻击到 $2$ 血奴隶主,则再分两种情况,当$j+k+l<7$时触发转移$f_{i+1,j+1,k-1,l+1}=f_{i,j,k,l} \times \frac {k} {j+k+l+1}$ ; 否则触发转移 $f_{i+1,j+1,k-1,l}=f_{i,j,k,l} \times \frac {k} {j+k+l+1}$

若攻击到 $3$ 血奴隶主则与 $2$ 血奴隶主类似,$j+k+l<7$时触发$f_{i+1,j,k+1,l}=f{i,j,k,l} \times \frac {l} {j+k+l+1}$ ;否则为$f_{i+1,j,k+1,l-1}=f_{i,j,k,l} \times \frac {l} {j+k+l+1}$

然后写代码的时候控制好循环就可以了w循环时要保证 $j+k+l \leq 7$

参考代码

GitHub

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> double dp[][][][]; double DFS(int,int,int,int); int main(){
int t;
int n,a,b,c;
double tmp;
scanf("%d",&t);
while(t--){
memset(dp,,sizeof(dp));
scanf("%d%d%d%d",&n,&a,&b,&c);
dp[][a][b][c]=;
double ans=;
for(int i=;i<=n;i++){
for(int j=;j<=;j++){
for(int k=;k+j<=;k++){
for(int l=;l+k+j<=;l++){
tmp=1.0/double(j+k+l+);
dp[i+][j][k][l]+=dp[i][j][k][l]*tmp;
if(j>)
dp[i+][j-][k][l]+=dp[i][j][k][l]*tmp*j;
if(k>){
if(l+j+k<)
dp[i+][j+][k-][l+]+=dp[i][j][k][l]*tmp*k;
else
dp[i+][j+][k-][l]+=dp[i][j][k][l]*tmp*k;
}
if(l>){
if(l+j+k<)
dp[i+][j][k+][l]+=dp[i][j][k][l]*tmp*l;
else
dp[i+][j][k+][l-]+=dp[i][j][k][l]*tmp*l;
}
if(dp[i][j][k][l]>)
ans+=dp[i][j][k][l]*tmp;
}
}
}
}
printf("%.2lf\n",ans);
}
return ;
}

Backup

然后放图w

[BZOJ 4832][lydsy 4月赛] 抵制克苏恩的更多相关文章

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

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Descripti ...

  2. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

  3. [补档][Lydsy2017年4月月赛]抵制克苏恩

    [Lydsy2017年4月月赛]抵制克苏恩 题目 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平. 如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一 ...

  4. 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望

    [BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...

  5. bzoj 4974: [Lydsy八月月赛]字符串大师

    4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 371  Solved: 190[Submit][Statu ...

  6. bzoj 4921: [Lydsy六月月赛]互质序列

    4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 188  Solved: 110[Submit][Status ...

  7. BZOJ.4832.[Lydsy1704月赛]抵制克苏恩(期望DP)

    题目链接 \(f[s][i][j][k]\)表示还剩\(s\)次攻击,分别有\(i,j,k\)个血量为\(1,2,3\)的奴隶主时,期望受到伤害. 因为期望是倒推,所以这么表示从后往前求,注意\(a, ...

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

    打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...

  9. BZOJ4832[Lydsy1704月赛]抵制克苏恩——期望DP

    题目描述 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的 ...

随机推荐

  1. Docker Machine 详解

    笔者在<Docker Machine 简介>一文中简单介绍了 Docker Machine 及其基本用法,但是忽略的细节实在是太多了.比如 Docker 与 Docker Machine ...

  2. 一些java方面面试题,没事做做看看(带答案)

    1. Switch能否用string做参数? a.在?Java? <http://lib.csdn.net/base/java>7 之前, switch 只能支持byte,short,ch ...

  3. ReactiveCocoa源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  4. jeecg 弹出框 点击按钮回调父页面 返回值

    jeecg 弹出框 点击按钮回调父页面 返回值 <t:base type="jquery"></t:base> <t:base type=" ...

  5. 修改phpstorm的字体样式和大小

    默认的字体实在太小,也太丑,必须修改下.就是强迫症,没错.下面截图配文字说明下 方法/步骤   首先进入设置,不解释   先设置软件界面上的字体.进入设置之后,选择(外观)Appearance.之后软 ...

  6. svn文件图

  7. 两种代理模式(JDK和Cglib)实例

    CGlib代理模式: package CGLIB; import java.lang.reflect.Method; import JDK.Test; import net.sf.cglib.prox ...

  8. java执行程序的内存分析系列专栏二之static变量和方法内存分析

    昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...

  9. 如何简单的实现新手引导之UGUI篇

    一个完整的游戏项目肯定是要做新手引导的,而引导做的好坏可能会影响玩家的留存.那么怎么简单的实现个简有效的引导呢!先不说废话,先看看效果,这是一个基于UGUI做的一个简单的引导! 怎么样,看着是那么回事 ...

  10. ReOut

    package JBJADV003;import java.io.*;public class ReOut { /** * @param args */ public static void main ...