给大佬递茶

题目大意:Alice 和 Bob 开始了递茶操作。一开始Alice 和 Bob 都有一个杯子里面装了𝑁吨的茶。现在每次 Alice 会等概率地随机向 垃圾桶里面倒入4𝐾, 3𝐾, 2𝐾或者𝐾吨的茶,并且如果 Alice 倒了𝑥吨的茶,Bob 就会向垃圾桶里面导入4𝐾 − 𝑥吨的茶。注意每次操作的时候 Alice 或者 Bob 的茶有可能不够多,这个时候就能倒多少到多少。现在问 Alice 在四种操作完全等概率的情况下,Alice 先把自己的茶倒光的概率加上 Alice 和 Bob 同时把茶倒光的概率的一半是多少。注意,Alice 和 Bob 每轮倒茶都是同时开始同时结束的

首先,我们发现k有没有是没什么区别的,因为

说实话,我不透彻,回头补上

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;

const int N = 201;

double f[N][N];
bool g[N][N];

inline double dfs(int n, int m)
{
if (n <= 0 && m <= 0) return 0.5;
if (n <= 0) return 1.0;
if (m <= 0) return 0.0;
if (g[n][m]) return f[n][m];
g[n][m] = true;
for (int i = 1; i <= 4; ++ i)
f[n][m] += 0.25 * dfs(n - i, m - 4 + i);
return f[n][m];
}

inline double calc(int n, int k)
{
if (n/k >= N) return 1.0;
return dfs((n / k) + (n % k ? 1 : 0), (n / k) + (n % k ? 1 : 0));
}

signed main()
{
int n, k;
cin >> n >> k;
printf ("%.6lf", calc(n, k));
return 0;
}