zoukankan      html  css  js  c++  java
  • 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;
    }
    


  • 相关阅读:
    HTML <h1>
    HTML <body> 标签
    如何挑选深度学习 GPU?
    视频动作定位的分层自关注网络:ICCV2019论文解析
    三维点云去噪无监督学习:ICCV2019论文分析
    摄像头定位:ICCV2019论文解析
    深度学习扫地机器人
    细粒度语义分割:ICCV2019论文解析
    目标形体形状轮廓重建:ICCV2019论文解析
    2-2.5-3D的室内场景理解
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5059758.html
Copyright © 2011-2022 走看看