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

算法提高 概率计算
时间限制: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();
	}


}

posted @ 2019-06-13 12:40  南墙1  阅读(36)  评论(0编辑  收藏  举报