hdu 4870 Rating

hdu 4870 Rating

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Rating

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 414    Accepted Submission(s): 261
Special Judge




Problem Description
A little girl loves programming competition very much. Recently, she has found a new kind of programming competition named “TopTopTopCoder”. Every user who has registered in “TopTopTopCoder” system will have a rating, and the initial value of rating equals to zero. After the user participates in the contest held by “TopTopTopCoder”, her/his rating will be updated depending on her/his rank. Supposing that her/his current rating is X, if her/his rank is between on 1-200 after contest, her/his rating will be min(X+50,1000). Her/His rating will be max(X-100,0) otherwise. To reach 1000 points as soon as possible, this little girl registered two accounts. She uses the account with less rating in each contest. The possibility of her rank between on 1 – 200 is P for every contest. Can you tell her how many contests she needs to participate in to make one of her account ratings reach 1000 points?

 


Input
There are several test cases. Each test case is a single line containing a float number P (0.3 <= P <= 1.0). The meaning of P is described above.
 


Output
You should output a float number for each test case, indicating the expected count of contest she needs to participate in. This problem is special judged. The relative error less than 1e-5 will be accepted.
 


Sample Input
   
   
1.000000 0.814700

 


Sample Output
   
   
39.000000 82.181160

 


Author
FZU
 


Source
 

题目:一个女孩打比赛,每次比赛结果若在前200名则能给她的rating加上50分,否则将会将去100分(rating最小为0,最大为1000—-可以进入前200的概率为p)。为了可以达到1000分。这个女孩使用两个帐号进行比赛,每次使用rating低的那个帐号比赛,直到有一个帐号rating达到1000。给定一个p。问最后须要进行比赛场数的期望值。

题解:首先我们想到的是推公式,以dp[i]代表从i*50-(i+1)*50的期望值。dp[0]和dp[1]须要单独处理。

            dp[0]代表我们从0-50须要进行的场数,分成两种情况:1.成功,概率为p,期望为1*p

                                                                                                              2.失败。概率1-p。期望为(1-p)*(1+dp[0])  

                                                                                                                —–所以dp[0]=1*p+(1-p)*(1+dp[0]) ,化简后dp[0]=1/p;

            dp[1]代表我们从50-100的场数期望,分成两种情况:1.成功,概率为p,期望为1*p

                                                                                                           2.失败,概率1-p,期望为(1-p)*(1+dp[0]+dp[1])   

                                                                                                                —–所以dp[1]=1*p+(1-p)*(1+dp[0]+dp[1]) ,化简后dp[1]=1+(1-p)/p*(1+dp[0]);

            i>2,dp[i]的求法,分成两种情况:1.成功,概率为p。期望为1*p

                                                                       2.失败,概率1-p,期望为(1-p)*(1+dp[i-2]+dp[i-1]+dp[i])   

                                                                        —–所以dp[i]=1*p+(1-p)*(1+dp[i-2]+dp[i-1]+dp[i])   。化简后dp[i]=1+(1-p)/p*(1+dp[i-2]+dp[i-1]);

这样,由于要使用两个帐号进行比赛,所以我们最后到达的状态就是一个帐号rating=1000,另外一个=950,仅仅须要进行dp求和即可了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

int main()
{
    double p,q;
    double dp[20];
    while(cin>>p)
    {
        memset(dp,0,sizeof(dp));
        q=1.0-p;

        double sum=0;
        dp[0]=1.0/p;
        dp[1]=1.0+q/p*(1+dp[0]);
        sum+=(dp[0]+dp[1])*2;

        for(int i=2;i<=19;i++)
        {
            dp[i]=1.0+q/p*(1+dp[i-1]+dp[i-2]);
            sum+=dp[i]*2;
        }
        printf("%.6lf\n",sum-dp[19]);
    }
    return 0;
}

 高斯消元的做法(公式同上):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double eps=1e-11;  //设置为1e-9时Wa了
double a[40][40],x[40];
int equ,var;

void Debug()
{
    for(int i=0; i<equ; i++)
    {
        for(int j=0; j<=var; j++)
            printf("%4.2lf ",a[i][j]);
        puts("");
    }
    puts("");
}

double Gauss()
{
    int k,col,max_r;

    for(k=0,col=0; k<equ&&col<var; k++,col++)
    {
        max_r=k;
        for(int i=k+1; i<equ; i++)
            if(fabs(a[i][col])>fabs(a[max_r][col])) max_r=i;

        if(max_r!=k)
            for(int i=0; i<=var; i++)
            {
                swap(a[max_r][i],a[k][i]);
            }

        if(fabs(a[k][col])<eps)
        {
            k--;
            continue;
        }

        for(int i=k+1; i<equ; i++)
        {
            if(fabs(a[i][col])>eps)
            {
                double t=a[i][col]/a[k][col];
                for(int j=col; j<=var; j++)
                {
                    a[i][j]=a[i][j]-a[k][j]*t;
                }
            }
        }
    }

    //Debug();

    double ans=0;
    for(int j=var-1; j>=0; j--)
    {
        double temp=a[j][var];
        for(int r=j+1; r<var; r++)
            temp=(temp-a[j][r]*x[r]);

        x[j]=temp/a[j][j];
    }
    for(int j=0; j<var; j++)
        ans+=2.0*x[j];
    return ans-x[19];
}

void init(double p)
{
    equ=var=20;
    memset(a,0,sizeof(a));
    memset(x,0,sizeof(x));
    for(int i=0; i<20; i++)
    {
        a[i][var]=1.0;
    }
    a[0][0]=p;
    a[1][0]=p-1;
    a[1][1]=p;
    for(int i=2; i<=19; i++)
    {
        a[i][i]=p;
        a[i][i-1]=p-1;
        a[i][i-2]=p-1;
    }
    //Debug();
}

int main()
{
    double p;
    while(scanf("%lf",&p)!=EOF)
    {
        init(p);
        printf("%.6lf\n",Gauss());
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116993.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 10.22 词法分析程序实验心得

    10.22 词法分析程序实验心得

    2021年9月10日
    63
  • linux怎么将文件复制到别的文件_linux 文件夹复制

    linux怎么将文件复制到别的文件_linux 文件夹复制1.前言本文主要讲解linux怎么复制文件到其他文件夹。在Linux和Unix系统上工作时,复制文件和目录是您每天要执行的最常见任务之一。cp是一个命令行实用程序,用于复制Unix和Linux系统上的文件和目录。在本文中,我们将解释如何使用cp命令。linux怎么复制文件到其他文件夹2.如何使用cp命令cp命令的使用语法:cp[OPTIONS]源…目标源可以有一个或多个文件或目录作为参数,目标可以有一个文件或文件夹作为参数。当源和目标参数都是文件时,cp命令将第一

    2022年8月23日
    3
  • PhpStorm激活码2025.1.1版本最新教程,永久有效激活码,亲测可用,记得收藏

    PhpStorm激活码教程永久有效2025.1.1激活码教程-Windows版永久激活-持续更新,Idea激活码2025.1.1成功激活

    2025年5月23日
    7
  • Android R setenforce 实现[通俗易懂]

    Android R setenforce 实现[通俗易懂]1、开机启动system/core/init/main.cppintmain(intargc,char**argv){#if__has_feature(address_sanitizer)__asan_set_error_report_callback(AsanReportCallback);#endifif(!strcmp(basename(argv[0]),”ueventd”)){returnueventd_main(argc,.

    2022年6月27日
    46
  • Ldap服务器搭建流程

    Ldap服务器搭建流程之前搭建了个Ldap服务器,今天想要再另一台机器上搭建的时候发现很多地方还是会遇到坑,于是将搭建过程梳理记录下来,避免以后再遇到坑一、安装配置ldap1、安装ldap    yuminstall-yopenldap*2、拷贝配置文件    cp/usr/share/openldap-servers/slapd.conf.obsolete/etc/openldap/slapd…

    2022年5月14日
    39
  • VSCode运行Python教程「建议收藏」

    VSCode运行Python教程「建议收藏」1)首先在自己电脑新建一个专门写Python代码的文件夹(建议使用英文命名)然后打开VSCode,点击在弹出的界面,点击“打开文件夹”(或者点击顶端菜单栏的“文件”,再选择“打开文件夹”),选择你创建的文件夹。2)打开你刚刚建立的文件夹—>新建文件,编写Python代码。参考下面操作。每次新建Python文件,点击你文件夹旁边的**“新建文件”按钮**—>输入“文件名.py…

    2025年8月1日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号