列表

详情


NC21626. 牛牛与牛妹的游戏

描述

牛牛 和 牛妹 正在玩一个游戏

牛牛扔了a个b面的骰子

牛妹扔了c个d面的骰子

对于一个x面的骰子,每个面依次会写有1到x的数

一个玩家的得分就是每个骰子朝上的面的数字的总和,一个玩家能赢另一个玩家当且仅当得分严格大于另一个玩家,给你a,b,c,d,如果牛牛不可能赢,输出-1

否则假设你知道了牛牛赢了,但是不知道牛牛和牛妹的具体分数,返回牛牛的期望得分

输入描述

输入一行,包含4个整数a,b,c,d (1 ≤ a,b,c,d ≤ 50)

输出描述

输出一个浮点数,误差在1e-3以内

示例1

输入:

1 2 1 5

输出:

2.0

示例2

输入:

3 1 1 3

输出:

3.0

示例3

输入:

1 5 1 1

输出:

3.4999999999999996

示例4

输入:

2 6 50 30

输出:

-1.0

示例5

输入:

50 11 50 50 

输出:

369.8865999182022

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 12ms, 内存消耗: 1708K, 提交时间: 2020-10-14 22:06:33

#include<cstdio>
using namespace std;
double f[55][2505], g[55][2505];
int main(){
	int a, b, c, d, i, j, k;double ans, s;
	scanf("%d%d%d%d", &a, &b, &c, &d);
	for(i = f[0][0] = 1;i <= a;i++)
		for(j = i;j <= b * i;j++)
			for(k = 1;k <= b && k <= j;k++)
				f[i][j] += f[i - 1][j - k];
	for(i = 1;i <= a * b;i++)f[a][i] /= b;
	for(i = g[0][0] = 1;i <= c;i++)
		for(j = i;j <= d * i;j++)
			for(k = 1;k <= d && k <= j;k++)
				g[i][j] += g[i - 1][j - k];
	for(i = 1;i <= c * d;i++)g[c][i] /= d;
	for(i = 1, s = 0;i <= a * b;i++){
		g[c][i] += g[c][i - 1];
		s += g[c][i - 1] * f[a][i];
	}for(i = 2, ans = 0;i <= a * b;i++)ans += i * f[a][i] * g[c][i - 1] / s;
	printf("%lf", s < 1e-6 ? -1 : ans);
	return 0;
}

上一题