ACdream 1113 The Arrow (概率dp求期望)

本文探讨了通过掷骰子来决定是否成为英雄的概率问题,详细介绍了如何计算掷到特定数字所需的期望时间。


The Arrow

Time Limit: 2000/1000MS (Java/Others)
Memory Limit: 128000/64000KB (Java/Others)
Problem Description

The history shows that We need heroes in every dynasty. For example, Liangshan Heroes. People hope that these heroes can punish the bad  guys and recover the justice. Nowadays, we also need heroes to provent us from being chopped, or being attacked by a bomb. 

Kuangbin is a very very very very very.... (very * 1e9 ) good boy, after he knows The Arrow, he want to be The Arrow of China. But he is also a little afraid of being killed by the bad guys. So he decides to throw dices to make the decision.

The dice is a cube with 1 2 3 4 5 6 on it's sides. When he throws a dice, every number is of the same probablity to appear. He will write down a number N in the paper at first, and then throw the dice. When the sum of the number he throwed is less than N, he will keep throwing. But if the sum exceeds N, this throwing does not count.

For example, If the sum is 5,and N is 6, if we throw 2, 5 + 2 > 6, then  the sum keeps to be 5.

If he can end the throwing in a certain time, he will make the decision to become The Arrow.

Now , kuangbin wonders that what's the expectation of the time of throwing dices.

Input

First line, The number of cases t <= 100

In the next t lines, there will be t numbers.

every number is not bigger than 100000

Output
Each test output a number rounded to the second digit.
Sample Input
1
1
Sample Output
6.00
Source
wuyiqi
Manager
wuyiqi

题目链接:http://acdream.info/problem?pid=1113

题目大意:掷骰子,如果之前掷到的点数和加当前掷到的点数大于n则不做处理,否则累加,求掷到数字n掷的次数的期望

题目分析:首先dp[n]肯定是0,往前推
得到dp[i] = cnt / 6dp[i] + 1/6dp[i - 1] + 1/6dp[i - 2] + ... + 1/6dp[i - 6] + 1,这里cnt表示的是之前点数和加上当前点数大于n的当前点数的个数,化简这个式子递推dp[i]即可

#include <cstdio>
#include <cstring>
int const MAXN = 1e5 + 5;
double dp[MAXN];

int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        memset(dp, 0, sizeof(dp));
        dp[n] = 0.0;
        for(int i = n - 1; i >= 0; i--)
        {
            dp[i] = 0;
            int cnt = 0;
            for(int j = 1; j <= 6; j++)
            {
                if(i + j > n)
                    cnt ++;
                else
                    dp[i] += dp[i + j];
            }
            dp[i] += 6;
            dp[i] /= (6 - cnt);
        }
        printf("%.2f\n", dp[0]);
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值