Java实现 蓝桥杯 算法提高 概率计算

时间:2023-01-14 22:32:20

算法提高 概率计算

时间限制:1.0s 内存限制:256.0MB

问题描述

  生成n个∈[a,b]的随机整数,输出它们的和为x的概率。

输入格式

  一行输入四个整数依次为n,a,b,x,用空格分隔。

输出格式

  输出一行包含一个小数位和为x的概率,小数点后保留四位小数

样例输入

2 1 3 4

样例输出

0.3333

数据规模和约定

  对于50%的数据,n≤5.

  对于100%的数据,n≤100,b≤100.

import java.io.IOException;
import java.util.Scanner; public class 概率计算 {
static int n, a, b, x;
static int max, min;
static double sum;
static double dp[][], arr[];
static int t;
public static void main(String [] args) throws IOException
{
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = sc.nextInt();
b = sc.nextInt();
x = sc.nextInt(); t = b-a+1;
sum = Math.pow(t, n); max = b*n;
min = 1; arr = new double[t+1];
dp = new double[n+1][max+1]; for(int i = 1, j = a; i <= t; ++i, ++j)
{
arr[i] = j;
} for(int i = a; i <= b; ++i)
{
dp[1][i] = 1;
} for(int i = 2; i <= n; ++i)
{
for(int j = 1; j <= t; ++j)
{
for(int k = min; k <= max; ++k)
{
if(dp[i-1][(int) (k-arr[j] <= 0? 0 : k-arr[j])] != 0)
{
dp[i][k] += dp[i-1][(int) (k-arr[j] <= 0? 0 : k-arr[j])];
}
}
}
}
double ans = 1.0*dp[n][x]/sum;
System.out.printf("%.4f", ans); sc.close();
} }