lightoj 1030 Discovering Gold

来源:互联网 发布:mac大写字母自动切换 编辑:程序博客网 时间:2024/05/23 21:23

题意:

有一个直线的金矿,每个点有一定数量的金子,

你从0开始,每次扔个骰子,扔出几点就走几步,然后把那个点的金子拿走;

如果扔出的骰子超出了金矿,就重新扔,知道你站在最后一个点;

问拿走金子的期望值是多少。

思路:

首先我们假设你现在站在第i个点,且从这个点开始走,

那么这个点的期望p[i] = p[i  +1] /6  + p[i + 2] / 6 + p[i + 3] /6 + p[i + 4] / 6 + p[i + 5] / 6 + p[i + 6] / 6 + p[i];

p[i] 初值就是这个点的金子数量,意思就是这个点的期望,是往后有6种情况,每种的六分之一;

当然情况数少于6的时候要处理一下;

所以从最后一个点往前算一边,就能的的出答案。

参考博客:http://blog.csdn.net/yeyeyeguoguo/article/details/46355873

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 105;double num[N];double p[N];int n;int main (){    int t;    int cas = 1;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i = 0; i < n; i++)        {            scanf("%lf",&num[i]);        }        p[n - 1] = num[n - 1];        for(int i =  n - 2; i >= 0; i--)        {            p[i] = num[i];            int dis = 6;            if(n - 1 - i < 6)                dis = n - 1 - i;            for(int j = 1; j <= dis; j++)            {                p[i] += (p[i + j] / dis);            }        }        printf("Case %d: %.10lf\n",cas++, p[0]);    }}
0 0
原创粉丝点击