期望专题 三国杀之 黄盖

来源:互联网 发布:淘宝助理如何导入宝贝 编辑:程序博客网 时间:2024/04/28 04:02
【问题描述】 xpp每天研究天文学研究哲学,对于人生又有一些我们完全无法理解的思考。
在某天无聊学术之后,xpp打开了http://web.sanguosha.com,准备用他心爱的黄盖虐人。进入了八人身份局,作为一位主公,xpp果断选了黄盖,用黄盖挑7人。 xpp为什么喜欢黄盖这个武将呢?因为苦肉是个很牛逼的技能。 苦肉——出牌阶段,你可以失去一点体力,然后摸两张牌。每回合中,你可以多次使用苦肉。 可见苦肉这个技能如果用得好那么是可以秒全场的。于是xpp把7个人全部轻松干掉。 虽然xpp的苦肉永远能秒全场,但是他想到了这样一个问题:某种特定情况下,黄盖期望杀人数有多少。 为了简化问题,xpp规定:牌堆里的牌分为4种,一种为能回复一点体力的(例如桃),有a张;一种能对任意一名角色造成一点伤害的(例如杀,决斗),有b张;一种能对所有角色造成一点伤害的(例如万箭齐发,南蛮入侵),),有c张;一种不能用出去的(例如闪),有d张。并且苦肉一次(即失去一点体力)只能摸一张牌,杀死一个人可以摸3张牌。黄盖不能在体力只有1的时候苦肉,黄盖初始无手牌。 场上总共有n名角色,每名角色m点血量,一名角色的血量到达0即视为被杀死。黄盖有s点血量。黄盖造成的伤害都不会被抵挡。 xpp智商过于强大,不屑于想此等低端问题,然后你就要把这道题做出来。 【输入】 输入文件名为huanggai.in。共一行,每行七个整数,分别为a,b,c,d,n,m,s。 【输出】 输出文件名为huanggai.out。 输出共一行,包含一个实数,表示所求的期望值。
【输入输出样例】
huanggai.in
huanggai.out
1 1 0 1 2 1 2
0.5000000000

【数据范围】 对于10%的数据,a=0。 对于另外10%的数据,b=0。 对于另外10%的数据,d=0。 对于上述30%的数据,n≤2。 对于60%的数据,c=0。 对于100%的数据,0≤a≤100,0≤b,d≤40,1≤n≤20,0≤c<m≤20,1≤s≤40。 你的答案与标准答案相差小于1e-6时被认为是正确的。

#include<cstdio>#define eps 1e-10int a,b,c,d,n,m,s,sum;double f[41][21][41][21][22],ans;int main(){    freopen("huanggai.in","r",stdin);    freopen("huanggai.out","w",stdout);    int i,t1,t2,t3,hp,nu;    double now;    scanf("%d%d%d%d%d%d%d",&a,&b,&c,&d,&n,&m,&s);    s--;    f[0][0][0][0][1]=1;    sum=b+c+d;    for(i=0;i<s;i++)      for(t1=0;t1<=b;t1++)        for(t2=0;t1+t2<=i&&t2<=c;t2++)        {          t3=i-t1-t2;          if(t3>d)continue;          for(hp=0;hp<m;hp++)          {            for(nu=1;nu<=n;nu++)            {              now=f[t1][t2][t3][hp][nu];              if(hp==m-1)                f[t1+1][t2][t3][t2][nu+1]+=now*(b-t1)/(sum-i);              else                f[t1+1][t2][t3][hp+1][nu]+=now*(b-t1)/(sum-i);              if(hp==m-1)                f[t1][t2+1][t3][t2][nu+1]+=now*(c-t2)/(sum-i);              else                f[t1][t2+1][t3][hp+1][nu]+=now*(c-t2)/(sum-i);              f[t1][t2][t3+1][hp][nu]+=now*(d-t3)/(sum-i);            }            ans+=n*f[t1][t2][t3][hp][n+1];          }        }    for(t1=0;t1<=b;t1++)      for(t2=0;t1+t2<=i&&t2<=c;t2++)      {        t3=i-t1-t2;        if(t3>d)continue;        for(hp=0;hp<m;hp++)          for(nu=1;nu<=n+1;nu++)          {            now=f[t1][t2][t3][hp][nu];            ans+=now*(nu-1);          }      }    printf("%.10lf\n",ans);    return 0;}


0 0
原创粉丝点击