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;
    }
    


  • 相关阅读:
    正则校验录入日期是否有效(含润年)
    java截取字符串中字节长度【转】
    python基础总结(oop)
    python基础总结(函数)
    python基础总结(字符串)
    python基础总结(集合容器)
    python基础总结(判断语句*循环语句)
    python基础总结(基本类型与运算符)
    python爬虫相关的一些面试题
    python爬虫基本知识
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5059758.html
Copyright © 2011-2022 走看看