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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值