HDU-1204-糖果大战(听说用到Markov process!)

糖果大战

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 2295    Accepted Submission(s): 787

Problem Description

生日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

Author

Speakless

Source

Gardon-DYGG Contest 2

Recommend

JGShining   |   We have carefully selected several similar problems for you:  1239 1730 1579 1207 1050

其实这道题超出了我的解题范围和知识体系......刚开始看解析的时候,有人提到Markov process.查了一下,简直一头雾水,

似乎是关于概论论的某个性质或者定理.......总之没有看懂......但是一位神牛用高中数学的方法解析了这道题......

不会的Oier一起学习学习!感谢 何秀枝分享他的解题技巧!

这是一个概率题,首先我们必须清楚我们要求的是什么!

设f(i)表示Speakless有i颗糖果的时候赢的概率,我们要求的就是f(n)

则根据题意我们知道,这时候:

1.Speakless赢这一局的概率是p(1-q),即f(i)变成f(i+1)

2.Speakless输这一局的概率是q(1-p),即f(i)变成f(i-1)

3.Speakless平这一局的概率是1-p(1-q)-q(1-p),即f(i)变成f(i)

因此:

f(i) = p(1-q)*f(i+1) + q(1-p)*f(i-1) + (1-p(1-q)-q(1-p))*f(i)

稍微变形:

p(1-q)*(f(i+1)-f(i)) = q(1-p)*(f(i)-f(i-1))令g(i)=f(i)-f(i-1),

则有p(1-q)*g(i) = q(1-p)g(i-1),即g(i)是等比数列,

设k=q(1-p)/(p(1-q)),则g(i) = k*g(i-1)

g(1) = f(1)-f(0)

g(2) = f(1)-f(0)

...

g(n) = f(n)-f(n-1)

...

g(n+m) = f(n+m)-f(n+m-1)

将上面的各个等式相加的:g(1)+g(2)+...+g(n+m)=f(n+m)-f(0)=1

g(1)+g(2)+...+g(n+m)=g(1)*(1-k^(n+m))/(1-k)

g(1)+g(2)+...+g(n)=g(1)*(1-k^(n))/(1-k)

回到开始定义,我们知道f(0)=0 (表示已经输了),f(n+m)=1(表示已经赢了)

g(1)=f(1)-f(0)=f(1)

因此g(1)+g(2)+...+g(n+m) = f(1)*(1-k^(n+m))/(1-k)=1............................................(1)

g(1)+g(2)+...+g(n) = f(1)*(1-k^(n))/(1-k)=f(n)...................................................(2)

我们要求的就是f(n),在(2)式中,只要f(1)是未知的,因此需要更(1)先求出f(1).最终f(n)=(1-k^n)/(1-k^(m+n))需要注意的几个地方:N==0、M==0、p==0、q==0、p==q集中特殊情况!

c++代码:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
    int N,M;
    double p,q,rate,k;
    while(cin>>N>>M>>p>>q)
    {
        if(N==0){cout<<"0.00"<<endl;continue;}
        if(M==0){cout<<"1.00"<<endl;continue;}
        if(p==0||q==1){cout<<"0.00"<<endl;continue;}
        if(q==0||p==1){cout<<"1.00"<<endl;continue;}
        if(p==q) rate=1.0*N/(M+N);   M,N不一定等于0.5
        else
        {
            k = q*(1-p)/(p*(1-q));
            rate = (1.0-pow(k,N))/(1.0-pow(k,M+N));      【幂运算】
        }
        cout<<fixed<<setprecision(2)<<rate<<endl;    【设置浮点数输出的有效数字位数】
    }
    return 0;

}

Java代码:

import java.io.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		while (input.hasNext())
		{
			double N = input.nextDouble(); // Speakless手上的糖果数N
			double M = input.nextDouble(); // Gardon手上的糖果数M
			double p = input.nextDouble(); // Speakless能解答出来的概率p
			double q = input.nextDouble(); // Gardon能解答出来的概率q

			if (N == 0)
			{
				System.out.println("0.00");
				continue;
			}
			if (M == 0)
			{
				System.out.println("1.00");
				continue;
			}
			if (p == 0 && q == 1)
			{
				System.out.println("0.00");
				continue;
			}
			if (p == 1 && q == 0)
			{
				System.out.println("1.00");
				continue;
			}
			if (p == q)
			{
				System.out.printf("%.2f", N / (N + M));
				System.out.println();
			}

			else
			{
				double k = q * (1 - p) / (p * (1 - q));
				double rate = (1 - Math.pow(k, N)) / (1 - Math.pow(k, N + M));

				System.out.printf("%.2f", rate);
				System.out.println();
			}
		}
	}

}

附上作者原文地址:http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=13123&messageid=1&deep=0

时间: 2024-11-03 21:14:44

HDU-1204-糖果大战(听说用到Markov process!)的相关文章

hdu 1204 糖果大战 (Markov Chains求期望)

糖果大战 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2336    Accepted Submission(s): 797 Problem Description 生日Party结束的那天晚上,剩下了一些糖果,Gandon想把所有的都统统拿走,Speakless于是说:"可以是可以,不过我们来玩24点,你不是已经拿到了一些糖果了吗

hdu 1204 糖果大战

Problem Description 生 日Party结束的那天晚上,剩下了一些糖果,Gandon想把所有的都统统拿走,Speakless于是说:"可以是可以,不过我们来玩24点,你不是 已经拿到了一些糖果了吗?这样,如果谁赢一局,就拿走对方一颗糖,直到拿完对方所有的糖为止."如果谁能算出来而对方算不出来,谁就赢,但是如果双方都能 算出或者都不能,就算平局,不会有任何糖果的得失. Speakless是个喜欢提前想问题的人,既然他发起了这场糖果大战,就自然很想赢啦(不然可就要精光了-_

HDU 吃糖果

吃糖果 Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 121   Accepted Submission(s) : 31 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gar

hdu 1204 深搜

#include <iostream> #include <string> #define MAX 110 #define OIL true #define BLANK false using namespace std; bool oil_map[MAX][MAX]; int dir_map[8][2]={ {1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1} }; void set_oil_map() { memset(oi

马尔可夫过程(Markov Process)和马尔可夫链

对于一个随机过程,如果其未来所处的状态仅与其当前状态有关,而与过去的状态无关,则该随机过程被称为Markov过程,其具有马尔可夫性(亦"无后效性"). 对于一个有限状态自动机,其状态集为S={s1, s2, ..., sn}.用X = x1, x2, ..., xT表示该状态机在t = 1, 2, ..., T时刻所处的状态.那么,我们称满足以下条件的状态链X为Markov链: (式1) P (x1, x2, ..., xT) = P(x1) * ∏(t=2)(T) P (xt | x

Markov过程(马尔科夫过程)

导入 赌徒甲有资本a元,赌徒乙有资本b元,两人进行赌博,每赌一局输者给赢者1元,没有和局,直赌至两人中有一人输光为止.设在每一局中,甲获胜的概率为p,乙获胜的概率为q=1-p,求甲先输光的概率. 这个实际上是Markov过程(马尔科夫过程),解题过程如下: 解:先设c=a+b:  r=q/p; 应用 hdu1204 糖果大战 AC代码 1 #include <stdio.h> 2 #include <math.h> 3 #define M 1e-12 4 5 int main()

隐马尔可夫模型(HMM:Hidden Markov Models)

理论部分转载自:http://blog.csdn.net/likelet/article/details/7056068 手动计算例子转载自:http://blog.sina.com.cn/s/blog_953f8a550100zh35.html 隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价值.平时,经常能接触到涉及 HMM 的相关文章,一直

Extending Markov to Hidden Markov

Extending Markov to Hidden Markov a tutorial on hidden markov models, Hidden Markov Models, hidden markov models tutorial, markov chains, markov chains examples,markov chains tutorial, markov models When we talked about Markov Process and training th

Markov chain

w https://en.wikipedia.org/wiki/Markov_chain https://zh.wikipedia.org/wiki/马尔科夫链 In probability theory and related fields, a Markov process, named after the Russian mathematician Andrey Markov, is a stochastic process that satisfies the Markov proper