BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩
2024-09-04 12:00:33
题目大意:
攻击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,b,c,k; double f[][][][]; int main(){
scanf("%d",&t);
f[i][j][p][q]//攻击了i次,一滴血的j个,二滴血的p个,三滴血的q个
while(t--){
scanf("%d%d%d%d",&k,&a,&b,&c);
memset(f,,sizeof(f));
f[][a][b][c]=.;
double ans=.;
for(int i=;i<k;i++){
for(int j=;j<=;j++){
for(int p=;p<=;p++){
for(int q=;q<=;q++){
if(j+p+q>)break;
f[i+][j][p][q]+=f[i][j][p][q]/(j+p+q+);
ans+=f[i][j][p][q]/(j+p+q+);
if(j+p+q==){
if(j)f[i+][j-][p][q]+=f[i][j][p][q]*j/(j+p+q+);
if(p)f[i+][j+][p-][q]+=f[i][j][p][q]*p/(j+p+q+);//攻击二滴血的,二滴血的-1,一滴血的+1
if(q)f[i+][j][p+][q-]+=f[i][j][p][q]*q/(j+p+q+);
}else{
if(j)f[i+][j-][p][q]+=f[i][j][p][q]*j/(j+p+q+);
if(p)f[i+][j+][p-][q+]+=f[i][j][p][q]*p/(j+p+q+);
if(q)f[i+][j][p+][q]+=f[i][j][p][q]*q/(j+p+q+);//攻击三滴血的-1,二滴血+1,三滴血+1
}
}
}
}
}
printf("%.2f\n",ans);
}
return ;
}
AC
最新文章
- (c语言编程)出现错误:null undeclared identifier
- jquery+jplayer实现歌词同步的mp3音乐播放器效果
- html中相似的标签、属性的区别
- CSS3初学篇章_3(属性选择符/字体样式/元素样式)
- 【转】cocos2d-x 开发中使用的一些工具
- 谈谈SpringMVC Validation
- IFS解惑
- Java中关于继承、类、多态、接口的知识点
- jquery属性与样式
- 2.Ray-消息发布器与消息存储器
- tcc-transaction 分析
- Pandas数据处理+Matplotlib绘图案例
- Java学习笔记之——常用类
- window10 matlabR2015b 安装minGw
- python 执行sql得到字典格式数据
- SPLIT_STR
- cxVerticalGrid赋值是实时更新
- C# 获取所有对象的字符串表示一ToString方法
- Linux运维之--LVS、Nginx、HAproxy有什么区别?
- you have mixed tabs and spaces fix this