HDU_3910 Liang Guo Sha

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 ;
}

 


發佈了211 篇原創文章 · 獲贊 24 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章