zoukankan      html  css  js  c++  java
  • Discovering Gold LightOJ

     1 #include<cstdio>//wrong_codes
     2 #include<algorithm>
     3 using namespace std;
     4 double ans[110],anss;
     5 int a[110],T,TT,n,endd;
     6 int main()
     7 {
     8     int i,j;
     9     scanf("%d",&T);
    10     for(TT=1;TT<=T;TT++)
    11     {
    12         scanf("%d",&n);
    13         for(i=1;i<=n;i++)
    14             scanf("%d",&a[i]);
    15         for(i=1;i<=n;i++)
    16             ans[i]=0;
    17         anss=0;
    18         ans[1]=1;
    19         for(i=1;i<=n;i++)
    20         {
    21             endd=n-i<6?n-i:6;
    22             for(j=1;j<=endd;j++)
    23                 ans[i+j]+=ans[i]/endd;
    24             anss+=a[i]*ans[i];
    25         }
    26         printf("Case %d: %.9lf
    ",TT,anss);
    27     }
    28     return 0;
    29 }

    注意:虽然以上的代码能通过,但是...下次还是不要用了。

    代码思路就是求出到达每一格的概率,然后每一格的金子乘上到达这一格的概率之和就是总期望。

    但是,这样做的时候会遇到很多难以理解的问题。比如以下一个看起来同样有着合理的想法的方法:ans[i]表示到达i格拿到的金币期望,再做一些很显然的递推。这个就是错误的。

    顺推的话,相比倒推,更容易出错/遗漏/...。

     1 #include<cstdio>//wrong_codes
     2 #include<algorithm>
     3 using namespace std;
     4 double ans[110];
     5 int a[110],T,TT,n;
     6 int main()
     7 {
     8     int i,j;
     9     scanf("%d",&T);
    10     for(TT=1;TT<=T;TT++)
    11     {
    12         scanf("%d",&n);
    13         for(i=1;i<=n;i++)
    14             scanf("%d",&a[i]);
    15         for(i=1;i<=n;i++)
    16             ans[i]=0;
    17         ans[1]=a[1];
    18         for(i=2;i<=min(n,6);i++)
    19         {
    20             for(j=1;j<i;j++)
    21                 ans[i]+=ans[j];
    22             ans[i]/=(i-1);
    23             ans[i]+=(double)a[i];
    24         }
    25         for(i=min(n,6)+1;i<=n;i++)
    26         {
    27             for(j=1;j<=6;j++)
    28                 ans[i]+=ans[i-j];
    29             ans[i]/=6;
    30             ans[i]+=(double)a[i];
    31         }
    32         printf("Case %d: %.9lf
    ",TT,ans[n]);
    33     }
    34     return 0;
    35 }

    正确的做法就是:概率正推,期望倒推。http://blog.csdn.net/nameofcsdn/article/details/52082746

    ans[i]表示从i格出发得到gold的期望。ans[i]=sum{ans[i+p]}(1<=p<=6)+a[i]

  • 相关阅读:
    [LeetCode] Majority Element II
    [Nginx] 事件模型
    [Nginx] 进程模型
    [C++] 函数中的字符串指针与数组
    [LeetCode] Shortest Distance to a Character
    [LeetCode] Number of Lines To Write String
    Ubuntu 16.04中安装谷歌Chrome浏览器
    Python、机器学习、计算机视觉、深度学习入门
    Sublime安装与配置
    [20160807][系统设计的三次迭代]
  • 原文地址:https://www.cnblogs.com/hehe54321/p/loj-1030.html
Copyright © 2011-2022 走看看