lightOJ 1030(期望)

题意:有一个迷宫是1×n的格子,一个人每到一个格子就能够把这个格子内的金子所有拿走,刚開始站在第1个格子,然后開始掷骰子得到点数x,他就要从当前位置走到加x的位置。假设发现位置是大于n的就又一次掷骰子直到符合,假设他到了第n个格子就能够结束了。

问这个人从迷宫里得到的金子的期望是多少。
题解:能够知道对于每一个位置。下一个位置仅仅能是后6个。所以从这个位置处得到的金子的期望f(i) = (f(i + 1) + f(i + 2) + … + f(i + 6)) / 6。假设这个位置后不足6。f(i) = (f(i + 1) + … + f(n)) / (n - i)。

#include <stdio.h>
#include <math.h>
const int N = 105;
int n, a[N];
double f[N];

int main() {
    int t, cas = 1;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        f[n - 1] = a[n - 1];
        for (int i = n - 2; i >= 0; i--) {  
            f[i] = 0;
            int cnt = n - i - 1;
            if (cnt > 6)
                cnt = 6;
            for (int j = i + 1; j <= i + cnt; j++)
                f[i] += f[j];
            f[i] = f[i] / cnt + a[i];
        }
        printf("Case %d: %.10lf
", cas++, f[0]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/bhlsheji/p/5364965.html