NC21626. 牛牛与牛妹的游戏
描述
输入描述
输入一行,包含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; }