• HDU 4870 Rating(概率、期望、推公式) && ZOJ 3415 Zhou Yu


    其实zoj 3415不是应该叫Yu Zhou吗。。。碰到ZOJ 3415之后用了第二个参考网址的方法去求通项,然后这次碰到4870不会搞。参考了chanme的,然后重新把周瑜跟排名都反复推导(不是推倒)四五次才上来写这份有抄袭嫌疑的题解。。。

    这2题很类似,多校的rating相当于强化版,不过原理都一样。好像是可以用高斯消元做,但我不会。默默推公式了。

    公式推导参考http://www.cnblogs.com/chanme/p/3861766.html#2993306

    http://www.cnblogs.com/lijunle/archive/2010/10/09/1846577.html

    各有不同,现在感觉第一个比较好理解。

     HDU 4870 Rating

    先考虑只注册一个帐号的情况(求的是初始e[0],即0到20的期望,有e[20]=0)

    e[0] = p*e[1]+(1-p)*e[0] +1  ==>   e[0] = e[1] +1/p

    e[1] = p*e[2]+(1-p)*e[0] +1  ==>   e[0] = e[2] +1/p+1/(p*p)

    e[2] = p*e[3]+(1-p)*e[0] +1

    e[n-1] = p*e[n]+(1-p)*e[n-3]+1

    e[n] = 0

    显然,可以知道,e[0] = e[k] + t[k]。(因为每一次代入后,e[0]跟e[k]都会是乘上系数p)

    代入一般情况下的,e[k] = p*e[k+1]+(1-p)*e[k-2]+1,-t[k] = p*(-t[k+1])+(1-p)*(-t[k-2])+1

    所以有了t[0]=0,t[1]=1/p,t[2]=1/(p*p)以及t[k],t[k+1],t[k-2]的关系,可以求出所有t[i]

    而2个帐号的时候,由于每次取rating小的参赛,必然是这样的结果(0,0)=>(1,0)=>(1,1)=>(2,1)=>....=>(19,19)=>(20,19)

    而t[k]表示的是一个帐号从0到达k的期望时间,所以答案上t[20]+t[19]。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 using namespace std;
     5 
     6 int main(){
     7     double p,t[22];
     8     while(~scanf("%lf",&p)){
     9         t[0]=0,t[1]=1./p,t[2]=1./p+1./(p*p);
    10         for(int i=3;i<=20;++i) t[i] = (1./p+1./p*t[i-1]-(1-p)/p*t[i-3]);
    11         printf("%.6lf
    ",t[19]+t[20]);
    12     }
    13     return 0;
    14 }
    View Code

    虽然觉得写完之后跟参考的非常非常非常……非常非常非常类似。。。

    ZOJ 3415 Zhou Yu

    (求的是初始e[n],即n到0的期望,有e[0]=0)

    类似的方法,不想打推导过程了。。。

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 
     5 double pp(double a,int n){
     6     double ret=1;
     7     while(n){
     8         if(n&1) ret *= a;
     9         a*=a;
    10         n>>=1;
    11     }
    12     return ret;
    13 }
    14  int main(){
    15      int n,m;
    16      while(~scanf("%d%d",&n,&m)){
    17          if(m==2){printf("%.10lf
    ",1.*n*(n+1));continue;}
    18          double ans = 1.*m/(m-2)/(m-2);
    19          double tmp = pp(1./(m-1),n) + 1.*n*(m-2) - 1;
    20          printf("%.10lf
    ",ans*tmp);
    21      }
    22      return 0;
    23  }
    View Code
  • 相关阅读:
    springmvc始终跳转至首页,不报404错误
    c3p0数据库连接池无法连接数据库—错误使用了username关键字
    maven无法下载依赖jar包—几种仓库的区别
    Goland开发工具安装教程
    Go语言代码规范指导
    go语言入门教程:基本语法之变量声明及注意事项
    为什么越来越多的人偏爱go语言
    go语言入门教程:基本语法—常量constant
    go语言入门教程:基本语法之数据类型
    三分钟了解Go语言的前世今生
  • 原文地址:https://www.cnblogs.com/nextbin/p/3864061.html
Copyright © 2020-2023  润新知