zoukankan      html  css  js  c++  java
  • ZOJ Problem Set

    题目大意:

    有n条路,选每条路的概率相等,初始能力值为f,每条路通过的难度值为ci,当能力值大于某条路A的难度值b时,能够成功逃离,花费时间ti,小于等于时,不能逃离,天数加一天,但能力值增加b.

    给定初始的能力值,求成功逃离的期望。

    分析:

    概率dp做的少,感觉不是很简单。

    设dp[j]表示能力值为j时,逃离的期望值。

    对于每条路i,当j>c[i]时,成功逃离+(ti[i]*p),否则加(+1+dp[j+c[j]])*p;

    从后往前递推,求出dp[f]。

    精度卡的好严,看看下面2个代码就行了

    WA的代码

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<iostream>
     6 #define INF 10000000
     7 using namespace std;
     8 int main()
     9 {
    10     int n,f;
    11     double dp[100000];
    12     int c[100000],t[100000];
    13     while(scanf("%d %d",&n,&f)!=EOF)
    14     {
    15         int sum=0,Max=-INF;
    16         for(int i=0; i<n; i++)
    17         {
    18             scanf("%d",&c[i]);
    19             Max=max(Max,c[i]);
    20             int tt=(int)((1.0+sqrt(5.0))/2.0*c[i]*c[i]);
    21             t[i]=tt;
    22             sum+=t[i];
    23         }
    24         double p=1.0/n;
    25         for(int i=Max+1; i<=2*Max; i++)
    26             dp[i]=(double)sum*p;
    27         for(int j=Max; j>=f; j--)
    28         {
    29             double tem=0.0;
    30             for(int i=0; i<n; i++)
    31             {
    32                 if(c[i]<j)
    33                     tem+=t[i]*p;
    34                 else
    35                     tem+=(1+dp[j+c[i]])*p;
    36             }
    37             dp[j]=tem;
    38         }
    39         printf("%.3lf
    ",dp[f]);
    40     }
    41     return 0;
    42 }

    AC 代码

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<iostream>
     6 #define INF 10000000
     7 using namespace std;
     8 int main()
     9 {
    10     int n,f;
    11     double dp[100000];
    12     int c[100000],t[100000];
    13     while(scanf("%d %d",&n,&f)!=EOF)
    14     {
    15         double sum=0;
    16         int Max=-INF;
    17         for(int i=0;i<n;i++)
    18         {
    19             scanf("%d",&c[i]);
    20             Max=max(Max,c[i]);
    21             int tt=(int)((1.0+sqrt(5.0))/2.0*c[i]*c[i]);
    22             t[i]=tt;
    23             sum+=t[i];
    24         }
    25         double p=1.0/n;
    26         for(int i=Max+1;i<=2*Max;i++)
    27             dp[i]=sum*p;
    28         for(int j=Max;j>=f;j--)
    29         {
    30             double tem=0.0;
    31             for(int i=0;i<n;i++)
    32             {
    33                 if(c[i]<j)
    34                     tem+=t[i]*p;
    35                 else
    36                     tem+=(1+dp[j+c[i]])*p;
    37             }
    38             dp[j]=tem;
    39         }
    40         printf("%.3lf
    ",dp[f]);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    短期阅读的书籍
    Expert .NET 2.0 IL Assembler 译者序
    Prism研究(for WPF & Silverlight)4.从Hello World开始(实战篇)
    (翻译) 《C# to IL》第一章 IL入门
    不申请连任MVP了,把机会留给新人吧!
    (翻译) 《C# to IL》第三章 选择和循环
    Prism研究(for WPF & Silverlight) 13
    (翻译) 《C# to IL》第二章 IL基础
    Resharper使用体会及一些资料
    推荐一个PD Report Model
  • 原文地址:https://www.cnblogs.com/tsw123/p/4375108.html
Copyright © 2011-2022 走看看