• 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 }
  • 相关阅读:
    第17章 标准库特殊设施
    第16章 模板与泛型编程
    String、StringBuffer、StringBuilder的区别
    Mycat分库分表 读写分离 主从切换
    nginx的配置与使用
    kafka的使用
    zookeeper的使用
    mysql数据库优化
    mysql数据库事务详细剖析
    new Thread的弊端及Java四种线程池的使用
  • 原文地址:https://www.cnblogs.com/tsw123/p/4375108.html
Copyright © 2020-2023  润新知