HDU1204 糖果大战

先来看一个例子,即赌徒输光问题:

赌徒甲有资本a元,赌徒乙有资本b元,两人进行赌博,每赌一局输者给赢者1元,没有和局,直赌至两人中有一人输光为止。设在每一局中,甲获胜的概率为p,乙获胜的概率为q=1-p,求甲先输光的概率。
 解:先设c=a+b;  r=q/p;
这个实际上是Markov过程(马尔科夫过程),具体细节不说了,结果就是:

HDU1204  这道糖果大战,也是这类题目,下面是自己的AC代码:

#include<stdio.h>
#include<math.h>
#define M 1e-12
int main()
{
double p,q,s,r;
int a,b;
while(scanf("%d%d%lf%lf",&a,&b,&p,&q)!=EOF)
{
if(b==0)printf("%.2lf\n",s=1);
else if(a==0)printf("%.2lf\n",s=0);
else if(p==0||q==1)printf("%.2lf\n",s=0);
else
{
r=q*(1-p)/(p*(1-q)); //即为题中的r ,因为甲胜的概率为p*(1-q);
if(fabs(r-1.0)<M)s=a*1.0/(a+b); //注意是fabs() 此为判断double型数据是否相等的方法
else s=(1-pow(r,a))/(1-pow(r,(a+b)));
printf("%.2lf\n",s);
}

}

return 0;
}


Ok,这就是我对这道题的总结;

 
posted @ 2012-03-08 11:14  龙杉老师  阅读(1200)  评论(0编辑  收藏  举报