首页 > 试题广场 >

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
写了个递归的代码,模拟游戏过程,但只通过了40%,LeetCode上通过了86/146,超出了时间限制。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

/**
 * @Date: 2020-05-02 8:01
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int W = sc.nextInt();
        ArrayList<Integer> ai = new ArrayList<>();//保存结束时的点数
        ArrayList<Double> ai2 = new ArrayList<>();//保存相应点数出现的概率
        getWay(K, W, ai,0,ai2,1);
        double c = 0;
        Iterator<Integer> it = ai.iterator();
        Iterator<Double> it2 = ai2.iterator();
        while (it.hasNext()){
            if (it.next()<=N)
                c+=it2.next();
            else
                it2.next();
        }
        System.out.println(String.format("%.5f",c));
    }

    private static void getWay(int k, int m, ArrayList<Integer> ai,int count,ArrayList<Double> ai2,double num) {
        if (count>=k){
            ai.add(count);
            ai2.add(num);
            return;
        }
        for (int i=1;i<=m;i++){
            getWay(k,m,ai,count+i,ai2,num/m);
        }
    }
}
LeetCode官方动态规划解答:
import java.util.Scanner;

/**
 * @Date: 2020-05-02 9:31
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int W = sc.nextInt();
        System.out.println(String.format("%.5f",new21Game(N,K,W)));
    }
    public static double new21Game(int N, int K, int W) {
        double[] dp = new double[N + W + 1];
        // dp[x] = the answer when Alice has x points
        for (int k = K; k <= N; ++k)
            dp[k] = 1.0;

        double S = Math.min(N - K + 1, W);
        // S = dp[k+1] + dp[k+2] + ... + dp[k+W]
        for (int k = K - 1; k >= 0; --k) {
            dp[k] = S / W;
            S += dp[k] - dp[k + W];
        }
        return dp[0];
    }
}

编辑于 2020-05-02 09:37:57 回复(2)