Stone Game
Time Limit: | 1000MS | Memory Limit: | 10000K |
Description
Dennis and Joyce love to collect stones and play games with them. Up till now they have collected Na white stones and Nb black stones, and they are going to play a new game. The rules of the game is as follows:
(1) All the stones are put into a pocket initially, so that each stone has equal possibility to be picked up, and each time a stone is picked up randomly.
(2) The two players take turns to pick up a stone, if the stone is black, the current player should put it back to the pocket; otherwise the player could keep the stone.
(3) Whoever picks up the last white stone wins the game.
Now they haven’t decided who plays first. To make a better decision, Dennis have asked you, an excellent programmer, to calculate the winning possibility for the first player. Since they are going to start playing soon, you must finish the job as quickly as possible, Come on!
Input
The first line is a single number n, the number of test cases followed. In the next n lines, each line contains two non-negative integers, Na and Nb,(0≤Na, Nb≤64).
Output
For each test case, output a real number indicating the possibility for the first player to win. The answer should be rounded to 6 digits after the decimal point. No extra spaces are allowed.
Sample Input
3
1 0
0 1
3 10
Sample Output
1.000000
0.000000
0.500282
Hint
No hint.
Source
解题思路:
这道题想了很久,挺蛋疼的,题解都找不到,哎~还是靠自己吧
我知道这个题大概是要用递推,可是递推式子真的很需要灵感
晚上终于想好了,大概是这样:
假设总共有w颗白色,b颗黑色,数组win用来保存获胜概率,win[i]表示当白色石头还剩i颗时轮到摸石头那个人的获胜概率
这样其他可以暂时不管,只考虑摸到的两种可能:摸到白色的概率是(i / (i + b)),摸到黑色的概率是(b / (i + b))
那么这个玩家获胜方法有两种:
1、假设i > 1,摸到白色的,这时i变为i - 1,但是还没赢,所以要乘上(1 - win[i - 1]),即在下一轮赢
2、摸到黑色的,这样就轮到对面玩家和当前玩家面对一样的情况了,即i颗白和b颗黑,那么当前玩家获胜的概率就要乘上(1 - win[i]),即对方不赢的概率
那么总结一个公式:
win[i] = (i / (i + b)) × (1 - win[i - 1]) + (b / (i + b)) × (1 - win[i])
解这个式子,结果:
win[i] = (i × (1 - win[i - 1]) + b) / (i + 2b)
3、递推的终点:i = 1,这时我们换一种方法,很简单:
win[1] = (1 / (1 + b)) + (b / 1 + b)2 × (1 / (1 + b)) + (b / 1 + b)4 × (1 / (1 + b)) + (b / 1 + b)6 × (1 / (1 + b)) + ...
用等比求和公式、极限法:
win[1] = (1 / (1 + b)) * lim n→inf((1 - (b / 1 + b)2n) / (1 - (b / 1 + b)2))
= (1 + b) / (1 + 2b)
4、然后,在这个地方突然发现,其实递归的终点可以到0,把2中得出来的公式中的i代为1,设win[0]为0
蛋疼的是在oj上还是w.a.
郁闷中,我感觉这个答案已经对了,不管了,先这样吧,想不出有什么没考虑到的了
我勒个去,改了一下代码,居然过了,求解这上下两个代码有什么不一样?