ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HDU-1204-糖果大战

2019-08-01 13:50:28  阅读:223  来源: 互联网

标签:p2 HDU p1 1204 概率 therefore 糖果 dp


题目描述

生日\(Party\)结束的那天晚上,剩下了一些糖果,\(Gandon\)想把所有的都统统拿走,\(Speakless\)于是说:“可以是可以,不过我们来玩\(24\)点,你不是已经拿到了一些糖果了吗?这样,如果谁赢一局,就拿走对方一颗糖,直到拿完对方所有的糖为止。”如果谁能算出来而对方算不出来,谁就赢,但是如果双方都能算出或者都不能,就算平局,不会有任何糖果的得失。

\(Speakless\)是个喜欢提前想问题的人,既然他发起了这场糖果大战,就自然很想赢啦(不然可就要精光了-_-)。现在他需要你的帮忙,给你他每局赢的概率和\(Gardon\)每局赢的概率,请你给出他可能获得这场大战胜利的概率。

Input

每行有四个数,\(Speakless\)手上的糖果数\(N\),\(Gardon\)手上的糖果数\(M(0<=N,M<=50)\)、一局\(Speakless\)能解答出来的概率\(p\)、一个问题\(Gardon\)能解答出来的概率\(q(0<=p,q<=1)\)。

Output

每行一个数,表示\(Speakless\)能赢的概率(用百分比计算,保留到小数点后2位)。

Sample Input

50 50 0.5 0.5
10 10 0.51 0.5
50 50 0.51 0.5

Sample Output

0.50
0.60
0.88

赤裸裸的数学题!!!

\(dp[i]\)表示\(S\)有\(i\)颗糖时,获胜的概率。

由题意得\(p*(1-q)\)为\(S\)每局获胜的概率

\(q*(1-p)\)为\(S\)每局失败的概率

\(1-p*(1-q)-q*(1-p)\)为平局的概率。

\(\therefore dp[i]=p*(1-q)*dp[i+1]+q*(i-p)*dp[i-1]+(1-p(*1-q)-q*(1-p))*dp[i]\)

移项得

\(\because dp[i]=p*(1-q)*dp[i+1]+q*(i-p)*dp[i-1]+(1-p(*1-q)-q*(1-p))*dp[i]\)

\(\therefore dp[i]+p*(1-q)*dp[i]+q*(1-p)*dp[i]=p*(1-q)*dp[i+1]+q*(i-p)*dp[i-1]+dp[i];\)

\(\therefore p*(1-q)*dp[i]+q*(1-p)*dp[i]=p*(1-q)*dp[i+1]+q*(i-p)*dp[i-1];\)

\(\therefore q*(1-p)*dp[i]-q*(1-p)*dp[i-1]=p*(1-q)*dp[i+1]-p*(1-q)*dp[i];\)

\(\therefore q*(1-p)*(dp[i]-dp[i-1])=p*(1-q)*(dp[i+1]-dp[i])\)

设\(g[i]=dp[i]-dp[i-1]\);

\(\because q*(1-p)*(dp[i]-dp[i-1])=p*(1-q)*(dp[i+1]-dp[i])\)

\(\therefore p*(1-q) g[i]=q*(1-p)*g[i-1];\)

\(\therefore g[i+1]/g[i]=q*(1-p)/(p*(1-q));\)

\(\therefore\) g[i]为等比数列.

设公比\(k=q*(1-p)/(p*(1-q))\);

若\(p==q\);

则\(dp[n]=n/n+m\);

若 \(p!=q\);
相加得

\(dp[0]\)表示失败,\(dp[n+m]\)表示获胜

\(\sum^{n+m}_{i=1}g[i]=dp[n+m]-dp[0]\)

\(\therefore \sum^{n+m}_{i=1}g[i]=1\)

\(g[1]+g[1]*k+g[1]*k^2+...+g[1]*k^{n+m-1}=1;\)

\(\therefore g[1]*(1+k+k^2+...+k^{n+m-1})=1;\)

\(s= 1+k+k^2+...+k^{n+m-1};\)

\(s=(k^{n+m}-1)/(k-1);\)

\(g[1]=1/s;\)

\(\therefore dp[n]-dp[0]=\sum^{n}_{i=1} g[i]=g[1]*(1+k...k^{n-1})=g[1]*(k^n-1)/(k-1);\)

\(\therefore dp[n]=(k^n-1)/((k-1)*s)=(k^n-1)/((k-1)*(((k^{n+m}-1)/(k-1))))=(k^n-1)/(k^{n+m}-1);\)

\(\therefore dp[n]=(k^n-1)/(k^{n+m}-1);\)

代码如下

#include<bits/stdc++.h>
using namespace std;
double p1,p2;
int A,B;
int main(){
    ios::sync_with_stdio(false);
    while(cin>>A>>B>>p1>>p2){
        double k=p2*(1-p1)/(p1*(1-p2));
        if(!B||p1==1)puts("1.00");
        else if(!A||p2==1)puts("0.00");
        else printf("%.2lf\n",(fabs(p1-p2)<1e-6?A*1.0/(A+B)*1.0:(pow(k,A)-1)/(pow(k,A+B)-1)));
    }
}

标签:p2,HDU,p1,1204,概率,therefore,糖果,dp
来源: https://www.cnblogs.com/dsjkafdsaf/p/11281987.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有