首页 > 试题广场 >

K点游戏

[编程题]K点游戏
  • 热度指数:2474 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小招喵某日闲来无事,想验一下自己的人品,于是给自己定了一个游戏规则:
这个游戏有三个因素:N,K,W
游戏开始的时候小招喵有0点,之后如果发现自己手上的点不足K点,就随机从1到W的整数中抽取一个(包含1和W),抽到哪个数字的概率都是相同的。
重复上述过程,直到小招喵获得了K或者大于K点,就停止获取新的点,这时候小招喵手上的点小于等于N的概率是多少?

输入:N = 5, K = 1, W = 5
输出:1.00000
说明:开始有0点,不足1点,从[1,5]中随机取一个整数(一共5个数字,所以每个数字取到的概率都是1/5),获得后得分无论如何都大于了1点,停止,概率为1

输入:N = 6, K = 1, W = 10
输出:0.60000
说明:开始有0点,不足1点,从[1,10]中随机取一个整数(一共10个数字,所以每个数字取到的概率都是1/10),获得后有6/10的概率小于6点,且满足大于1点的条件,概率为0.6

输入描述:
输入为3个整数,分别对应N,K,W,中间用空格隔开

其中0 <= K <= N <= 10000,1 <= W <= 10000


输出描述:
输出为概率值,保留5位小数
示例1

输入

21 17 10

输出

0.73278
写了个递归的代码,但是只能通过百分之二十,实在找不出原因,大佬们帮忙看看哪里有问题
class Solution:
    def __init__(self):
        self.res = 0
        self.count = 0
    def solution(self, n, k, w):
        def helper(i, u):
            if i >= k:
                self.count += u
                if i <= n:
                    self.res += u
                return
            for j in range(1, w+1):
                helper(i+j, u/w)
        helper(0, 10000)
        ans = self.res/self.count
        print(round(ans, 5))



if __name__ == "__main__":
    n, k, w = map(int, input().split())
    case = Solution()
    case.solution(n,k,w)


编辑于 2020-04-11 17:48:00 回复(0)
详解在这篇博客:
看完步骤,很容易写出代码。
if __name__=='__main__':
    n, k, w = list(map(int, input().split()))
    dp = [0]*(k+w) 
    for i in range(k, n+1):
        dp[i] = 1 
    s = min(w, n-k+1)
    for i in range(k-1, -1, -1):
        dp[i] = s / w
        s += dp[i] - dp[i+w]
    print(round(dp[0],5))


发表于 2019-08-09 10:47:26 回复(1)