zoukankan      html  css  js  c++  java
  • TopCoder SRM 667 Cats On The Circle

    Link
    首先给出一个模型:赌徒输光问题。
    赌徒输光问题就是一个带吸收壁的随机游走问题,设(f(a,b,p))表示初始位置为(a),向右走的概率为(p),向左走的概率为(1-p),在没到过(0)的情况下到(a+b)的概率。
    (g_i=f(i,a+b-i,p)),显然有(g_0=0,g_{a+b}=1,g_i=pg_{i+1}+(1-p)g_{i-1})
    推一推可以得到(g_{i+1}-g_i=frac{1-p}p(g_i-g_{i-1})),那么(g_n=g_1frac{1-(frac{1-p}p)^n}{1-frac{1-p}p})
    代入(g_{a+b}=1)即可解出(g_1),这样我们就解决了计算(f)的问题。
    那么原问题的答案就可以通过枚举是从左边还是右边传到(k)得出计算式(f(n-k-1,k-1,p)f(1,n-2,1-p)+f(k-1,n-k-1,1-p)f(1,n-2,p))

    #include<bits/stdc++.h>
    typedef long double ld;
    class CatsOnTheCircle
    {
        ld f(int a,int b,ld p)
        {
    	if(fabs(p-0.5)<1e-8) return 1.0*a/(a+b);
    	if(p<0.5+1e-8) return 1-f(b,a,1-p);
    	return (1-powl((1-p)/p,a))/(1-powl((1-p)/p,a+b));
        }
    public:
        double getProb(int n,int k,int p)
        {
    	ld q=p/1000000000.0;
    	return f(n-k-1,k-1,q)*f(1,n-2,1-q)+f(k-1,n-k-1,1-q)*f(1,n-2,q);
        }
    };
    
  • 相关阅读:
    染色法判定二分图
    Kruskal算法求最小生成树
    Prim算法求最小生成树
    Floyd算法求多源最短路
    spfa判断负环
    java 线程的使用
    java IO基础
    数据库 EXISTS与NOT EXISTS
    数据库 何为相关查询和不相关查询?
    数据库的基础知识
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12243951.html
Copyright © 2011-2022 走看看