P - Discovering Gold LightOJ - 1030

P - Discovering Gold

LightOJ - 1030

https://vjudge.net/contest/349029#problem/P

题目描述:

长为n的山洞,从0出发,每次掷一个6面的色子,得到的点数x。假设当前位置i,如果i+x<=n,就移动到i+x。否则再掷一次。直到走到第n个点。

每个点都有一定的金币。问他这一趟能得到金币的期望。

分析:

因为i+x<=n,所以相当于每次最多加min(n-i,6)步。所以从i出发,假设得到的点数为k,那么k的区间为(1,min(n-i,6) )。

dp[i]表示第i个位置的期望。从i点可以转移到i+k点。k对应的每个整数,概率都是相同的,即u=1/min(n-i,6) 。所以从后往前推,就有dp[i]+=dp[i+k] * u。

代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=106;
int main()
{
    int T;
    scanf("%d",&T);
    for(int k=1;k<=T;k++)
    {
        int n;
        scanf("%d",&n);
        int a[n+6];
        double dp[n+6];
        memset(dp,0,sizeof dp);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            dp[i]=a[i];
        }
        for(int i=n-1;i>=1;i--)
        {
            int p=n-i>6?6:n-i;
            for(int j=1;j<=p;j++)
            {
                dp[i]+=dp[i+j]*1.0/p;
            }           
        }
        printf("Case %d: %.6f\n",k,dp[1]);
    }   
    return 0;
}

 

 

posted on 2020-03-09 22:29  Aminers  阅读(99)  评论(0编辑  收藏  举报

导航