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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简易旋转倒立摆_小车倒立摆受力分析讲解

    简易旋转倒立摆_小车倒立摆受力分析讲解旋转倒立摆调节经验前言程序框架关于直立关于自动起摆前言近期在做2013年电赛控制类题目–简易旋转倒立摆装置,自己并不是自动化专业的学生,没有学过自动控制原理,倒立摆其实是一个十分经典的自动控制模型,我们只能是边做边学习,逐渐去了解倒立摆。我认为倒立摆有两个难点,一个是自动起摆一个是机械结构,其中自动起摆涉及到PID算法与运动方程的求解,而机械结构主要是尽量减小转动阻尼同时避免旋转时线的缠绕。…

    2022年4月19日
    55
  • 用js来实现那些数据结构05(栈02-栈的应用)「建议收藏」

    上一篇文章我们一起实现了栈,那么这一篇文章我们一起来用栈解决问题。看看如何用栈来解决进制转换,平衡圆括号以及汉诺塔问题,使我们对栈有更为深入的理解。1、进制转换我们先来看看十进制如何转换成二进制,

    2022年3月25日
    43
  • linux tomcat宕机自动启动脚本,tomcat宕机自动重启脚本「建议收藏」

    linux tomcat宕机自动启动脚本,tomcat宕机自动重启脚本「建议收藏」#!/bin/bash#获取tomcat进程ID/usr/share/tomcatTomcatID=$(ps-ef|greptomcat|grep-w‘tomcat‘|grep-v‘grep‘|awk‘{print$2}‘)#tomcat启动程序(这里注意tomcat实际安装的路径)#StartTomcat=/usr/local/tomcat/bin/startup.s…

    2022年7月23日
    16
  • 精美的液晶数字字体素材[通俗易懂]

    精美的液晶数字字体素材[通俗易懂]液晶数字应该比较常见,那么液晶数字字体的应用也是相对广泛了,可以运用于一切需要液晶显示屏上的数字字体显示。对于这样一种有着广泛的应用数字字体,选择使用哪款液晶数字字体也是一个很重要的问题啦!为此,特意为大家收集了几款液晶数字字体供大家选择,喜欢的朋友赶紧收藏起来吧!  DS-Digital字体是一款比较常规的液晶数字字体,这款字体的仅支持数字和大写字母输入,字体端正,结构完整,整体视觉呈现效果…

    2025年7月27日
    5
  • USB协议基础篇

    USB协议基础篇初次接触USB的同学,可能会被里面各种名词给搞晕,下面就来梳理一下这些知识,希望能帮助大家理解USB。文章目录 一,从最常见的名词说起 1.1什么是USB 1.2USB协议版本 1.3USB接口分类 1.4PIPE 1.5endpoint 1.6管道通信方式 1.7传输方式 1.7逻辑设备 1.8interface 1.9class协议 1.10host/device 二,USB框架/拓扑结构

    2022年6月18日
    44
  • 驱动程序模型:wddm2.0_编写一个简单的驱动

    驱动程序模型:wddm2.0_编写一个简单的驱动WDF驱动程序开发1.引言设备驱动程序是硬件设备连接到计算机系统的软件接口,任何设备都必须有相应的驱动程序才能在计算机系统上正常工作。设备驱动程序的优劣直接关系到整个系统的性能和稳定性,因此,设计和开发稳定高效的驱动程序具有重要意义。WDF(WindowsDriverFoundation)是微软提出的下一代全新的驱动程序模型,它是在WDM(windowsDriverModel)…

    2022年9月1日
    7

发表回复

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

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