zoukankan      html  css  js  c++  java
  • HDU-1204-糖果大战

    题目描述

    生日(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))为平局的概率。

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

    移项得

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

    ( herefore 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];)

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

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

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

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

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

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

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

    ( herefore) 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])

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

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

    ( herefore 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;)

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

    ( herefore 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);)

    ( herefore 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
    ",(fabs(p1-p2)<1e-6?A*1.0/(A+B)*1.0:(pow(k,A)-1)/(pow(k,A+B)-1)));
    	}
    }
    
  • 相关阅读:
    Linux crontab 命令
    tcpdump抓包工具
    tcpdump过滤某个端口
    ARM处理器基础Cortex-M4
    rtems floating poing switch
    ARM处理器的堆栈和函数调用,以及与Sparc的比较
    关于调用堆栈,任务堆栈
    如何测试嵌入式处理器的CPU使用率
    关于嵌入式实时操作系统的实时性
    RTEMS API
  • 原文地址:https://www.cnblogs.com/dsjkafdsaf/p/11281987.html
Copyright © 2011-2022 走看看