http://acm.hdu.edu.cn/showproblem.php?pid=3910
題意:
這個題目看了網上的好多題意說明,感覺和我理解的都有一些小小的出入,也不知道是我理解錯了還是沒有理解他們的意思, 下面我就說下我的理解吧,首先我們假設Alice出1的概率是x,Bob出1的概率是y,我們用EA(x,y)表示Alice在兩者出1的概率分別爲x和y的期望得分,那麼我們很容易可以推出下面的式子:EA(x,y) = a*x*y+b*(1 - x)*(1 - y) - x*(1 - y)*c - y*(1 - x)*c = y * ( (a + b + 2*c)*x - (b + c) ) + b - (b + c)*x ,化簡到這裏之後我們就可以開始討論了,因爲題目的意思是要你求在某個x下,無論y取什麼值,得出的最小的那個EA最大,那麼我們就可以這樣去考慮:當 x >= (b + c) / (a + b + 2 * c ) 時 ,y前面的係數是正的,因此作爲最小的EA一定是y = 0 的時候取到,也就是說, 這個時候的EA(x) = b - (c + b) * x ,其中 x >= (b + c) / (a + b + 2 * c ) 。 當x < (b + c) / (a + b + 2 * c )時,這時候y前面的係數是負的,當取某個x的時候,y取遍所有的值使得EA最小的那個y一定是1,這樣此時的EA(x) = (a + c)*x - c ,其中x < (b + c) / (a + b + 2 * c ) ,這樣我們就可以發現在 x >= (b + c) / (a + b + 2 * c ) 時,EA是單調遞減的,所有最大的EA = b - (c + b) * (b + c) / (a + b + 2 * c ) = ( a*b - c*c ) / (a + b + 2 * c) 。同理也可以證明當 x<(b + c) / (a + b + 2 * c )時EA的最大值也是該值。綜上所述可以得到最大的EA應該是 : ( a*b - c*c ) / (a + b + 2 * c) 。
代碼:
#include <stdio.h>
#include <string.h>
const double eps = 1e-10 ;
double a , b , c ;
int main(){
while( scanf("%lf %lf %lf",&a,&b,&c) == 3){
double ans = ( a*b - c*c ) / (a + b + 2*c) ;
printf("%.6lf\n",ans + eps );
}
return 0 ;
}