• HDU 4870 Rating 高斯消元法


    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870

    题意:用两个账号去參加一种比赛,初始状态下两个账号都是零分,每次比赛都用分数低的账号去比赛。有P的概率取胜,相应账号分数上涨50分,否则相应账号分数下降100分,问当有一个账号分数达到1000分时參加比赛次数的数学期望是多少。

    思路:比赛期间以为是一道推公式的题,推了半天没什么收获。

    赛后想了想。看了解题报告以后。知道了这样的每一个分数相应状态受到两个状态以上推得而且不是从后向前推得情况能够用高斯消元来解。状态0~状态209分别代表者分数为(0,0),(50,0)...(950,950)到有一个账号的分数为1000的数学期望。E(X,Y)=p(E(x1,y1)+1)+(1-p)(E(x2,y2)+1),(x1,y1)代表着这次比赛取胜之后两个账号的分数,(x2,y2)代表着这次比赛失败之后两个账号的分数。

    状态中不用计入状态(1000,?)是由于除了(1000,950)外其它状态不会出现。而(1000,950)状态仅仅与状态(950,950)有关,而且(950,950)不会从(1000,950)得到,210个状态中没有状态是与(1000,?

    )状态相关,所以不须要处理。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <map>
    #include <cstdlib>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <ctype.h>
    #include <algorithm>
    #include <string>
    #include <set>
    #define PI acos(-1.0)
    #define maxn 210
    #define INF 0x7fffffff
    #define eps 1e-8
    #define MOD 1000000009
    typedef long long LL;
    typedef unsigned long long ULL;
    using namespace std;
    double a[220][220],b[220];
    int all[25];
    double gauss_elimination(int n)
    {
        int i,j,k,row;
        double maxp,t;
        for(k=0; k<n; k++)
        {
            for(maxp=0,i=k; i<n; i++)
                if (fabs(a[i][k])>eps)
                {
                    maxp=a[row=i][k];
                    break;
                }
            if(fabs(maxp)<eps) return 0;
            if(row!=k)
            {
                for(j=k; j<n; j++)
                    swap(a[k][j],a[row][j]);
                swap(b[k],b[row]);
            }
            for (int j = 0; j < n; j++)
            {
                if (k == j) continue;
                if (fabs(a[j][k]) > eps)
                {
                    double x = a[j][k] / a[k][k];
                    for (int i = k; i < n; i++)
                    {
                        a[j][i] -= a[k][i] * x;
                    }
                    b[j] -=b[k]*x;
                }
            }
        }
                return 1;
    }
    int init()
    {
        all[0]=0;
        for(int i=1; i<=21; i++)
        {
            all[i]=all[i-1]+i;
        }
        return 0;
    }
    int main()
    {
        double p;
        init();
        while(~scanf("%lf",&p))
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            for(int i=0; i<20; i++)
            {
                for(int j=0; j<=i; j++)
                {
                    a[all[i]+j][all[i]+j]+=1;
                    b[all[i]+j]+=1;
                    a[all[i]+j][all[i]+max(j-2,0)]+=(p-1);
                    if(j+1<=i)
                        a[all[i]+j][all[i]+j+1]+=(-p);
                    else
                    {
                        if(i==19&&j==19)
                            continue;
                        else a[all[i]+j][all[j+1]+i]+=(-p);
                    }
                }
            }
            gauss_elimination(210);
            printf("%.6lf
    ",b[0]/a[0][0]);
        }
        return 0;
    }
    


  • 相关阅读:
    流量控制--2.传统的流量控制元素
    流量控制--1.概览
    Opentelemetry Collector的配置和使用
    高德全链路压测——精准控压的建设实践
    高德全链路压测——语料智能化演进之路
    业内首发车道级导航背后——详解高精定位技术演进与场景应用
    浅析云控平台画面传输的视频流方案
    关于卫星定位,你想知道的一切
    Pod容器中安装软件包
    面试应该怎么问问题?
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5059758.html
Copyright © 2020-2023  润新知