HDU_3910 Liang Guo Sha

来源:互联网 发布:黑马程序员好吗 编辑:程序博客网 时间:2024/04/29 09:08

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

 


原创粉丝点击