HDU 糖果大战——概率论、坑题
Problem Description
生日Party结束的那天晚上,剩下了一些糖果,Gandon想把所有的都统统拿走,Speakless于是说:“可以是可以,不过我们来玩24点,你不是已经拿到了一些糖果了吗?这样,如果谁赢一局,就拿走对方一颗糖,直到拿完对方所有的糖为止。”如果谁能算出来而对方算不出来,谁就赢,但是如果双方都能算出或者都不能,就算平局,不会有任何糖果的得失。
Speakless是个喜欢提前想问题的人,既然他发起了这场糖果大战,就自然很想赢啦(不然可就要精光了-_-)。现在他需要你的帮忙,给你他每局赢的概率和Gardon每局赢的概率,请你给出他可能获得这场大战胜利的概率。
Input
每行有四个数,Speakless手上的糖果数N、Gardon手上的糖果数
M(0<=N,M<=50)
、一局Speakless能解答出来的概率p、一个问题Gardon能解答出来的概率q(0<=p,q<=1)
。
Output
每行一个数,表示Speakless能赢的概率(用百分比计算,保留到小数点后2位)。
Sample Input
1 | 50 50 0.5 0.5 |
Sample Output
1 | 0.50 |
Author
Speakless
Source
Gardon-DYGG Contest 2
十分典型的坑题,测试点里面有特别多的数据是坑你的。。。。害得我3次WA。
容易看出赢一次的概率为p(1-q)
记为win,输一次的概率为q(1-p)
记为lose,那么平一次的概率就是1-win-lose
,记为tie。
记f(x)
为有x
个糖果时候的胜率,容易看出f(x)=win*f(x+1)+lose*f(x-1)+tie*f(x)
。
接着,我居然尝试了递归——失败了。。。。。(←其实我觉得再改改也许能成功。)
这是个双向递推式,所以我们需要在上限和下限处各找到一个初值。根据题意f(0)=0,f(n+m)=1
。(这个十分容易理解,你手上没有糖果的时候就必失败,手上存在全部糖果的时候就必胜。)
然后用RSolve查找通项。(←喂喂,这件事情好像比赛的时候没法干啊。)
这就解决了我会说?
哦,对了,实际上我们要求的其实是f(n)
。
至于其他坑的地方,请见代码里面那多的不可直视的if else
AC代码:
1 | //HDU 糖果大战 |