leetcode *808. 分汤(2022.11.21)
admin
2024-04-10 18:13:35
0

【题目】*808. 分汤

有 A 和 B 两种类型 的汤。一开始每种类型的汤有 n 毫升。有四种分配操作:

提供 100ml 的 汤A 和 0ml 的 汤B 。
提供 75ml 的 汤A 和 25ml 的 汤B 。
提供 50ml 的 汤A 和 50ml 的 汤B 。
提供 25ml 的 汤A 和 75ml 的 汤B 。
当我们把汤分配给某人之后,汤就没有了。每个回合,我们将从四种概率同为 0.25 的操作中进行分配选择。如果汤的剩余量不足以完成某次操作,我们将尽可能分配。当两种类型的汤都分配完时,停止操作。

注意 不存在先分配 100 ml 汤B 的操作。

需要返回的值: 汤A 先分配完的概率 + 汤A和汤B 同时分配完的概率 / 2。返回值在正确答案 10−510^{-5}10−5 的范围内将被认为是正确的。

示例 1:

输入: n = 50
输出: 0.62500
解释:如果我们选择前两个操作,A 首先将变为空。
对于第三个操作,A 和 B 会同时变为空。
对于第四个操作,B 首先将变为空。
所以 A 变为空的总概率加上 A 和 B 同时变为空的概率的一半是 0.25 *(1 + 1 + 0.5 + 0)= 0.625。

示例 2:

输入: n = 100
输出: 0.71875

提示:
0 <= n <= 109​​​​​​​

【解题思路1】动态规划

首先,由于四种分配操作都是 25 的倍数,因此我们可以将 n 除以 25(如果有余数,则补 1),并将四种分配操作变为 (4,0),(3,1),(2,2),(1,3),且每种操作的概率均为 0.25。

当 n 较小时,我们可以用动态规划来解决这个问题。设 dp(i,j) 表示汤 A 和汤 B 分别剩下 i 和 j 份时所求的概率值,即汤 A 先分配完的概率 + 汤 A 和汤 B 同时分配完的概率除以 2 。 状态转移方程为:

dp(i,j)=1/4×( dp(i−4,y)+dp(i−3,y−1)+dp(i−2,y−2)+dp(i−1,y−3) )

我们仔细考虑一下边界条件:

当满足 i>0,j=0,此时无法再分配,而汤 A 还未分配完成,汤 A 永远无法完成分配,此时 dp(i,j)=0;

当满足 i=0,j=0,此时汤 A 和汤 B 同时分配完的概率为 1.0,汤 A 先分配完的概率为 0,因此 dp(i,j)=1.0×0.5=0.5;

当满足 i=0,j>0,此时无法再分配,汤 A 先分配完的概率为 1.0,汤 B 永远无法完成分配,因此 dp(i,j)=1.0;

因此综上,我们可以得到边界条件如下:

dp(i,j)={0,i>0, j=00.5,i=0, j=01,i=0, j>0​dp(i,j)= \begin{cases} 0, & \text{i>0, j=0}\\ 0.5, & \text{i=0, j=0}\\ 1, & \text{i=0, j>0} \end{cases} ​dp(i,j)=⎩⎪⎨⎪⎧​0,0.5,1,​i>0, j=0i=0, j=0i=0, j>0​​

我们可以看到这个动态规划的时间复杂度是 O(n2),即使将 n 除以 25 之后,仍然没法在短时间内得到答案,因此我们需要尝试一些别的思路。 我们可以发现,每次分配操作有 (4,0),(3,1),(2,2),(1,3) 四种,那么在一次分配中,汤 A 平均会被分配的份数期望为 E(A)=(4+3+2+1)×0.25=2.5,汤 B 平均会被分配的份数期望为 E(B)=(0+1+2+3)×0.25=1.5。因此在 n 非常大的时候,汤 A 会有很大的概率比 B 先分配完,汤 A 被先取完的概率应该非常接近 1。事实上,当我们进行实际计算时发现,当 n≥4475 时,所求概率已经大于 0.99999 了(可以通过上面的动态规划方法求出),它和 1 的误差(无论是绝对误差还是相对误差)都小于 10−510^{−5}10−5
。实际我们在进行测算时发现:

n=4475,p≈0.999990211307
n=4476,p≈0.999990468596
因此在 n≥179×25n 时,我们只需要输出 1 作为答案即可。在其它的情况下,我们使用动态规划计算出答案。

class Solution {public double soupServings(int n) {n = (int) Math.ceil((double) n / 25);if (n >= 179) {return 1.0;}double[][] dp = new double[n + 1][n + 1];dp[0][0] = 0.5;for (int i = 1; i <= n; i++) {dp[0][i] = 1.0;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = (dp[Math.max(0, i - 4)][j] + dp[Math.max(0, i - 3)][Math.max(0, j - 1)] + dp[Math.max(0, i - 2)][Math.max(0, j - 2)] + dp[Math.max(0, i - 1)][Math.max(0, j - 3)]) / 4.0;}}return dp[n][n];}
}

【解题思路2】DFS

class Solution {private double[][] memo;public double soupServings(int n) {n = (int) Math.ceil((double) n / 25);if (n >= 179) {return 1.0;}memo = new double[n + 1][n + 1];return dfs(n, n);}public double dfs(int a, int b) {if (a <= 0 && b <= 0) {return 0.5;} else if (a <= 0) {return 1;} else if (b <= 0) {return 0;}if (memo[a][b] == 0) {memo[a][b] = 0.25 * (dfs(a - 4, b) + dfs(a - 3, b - 1) + dfs(a - 2, b - 2) + dfs(a - 1, b - 3));}return memo[a][b];}
}

相关内容

热门资讯

刚收葡萄酒和威士忌,又瞄准黄酒... 在母公司完成对青岛饮料并购后,上市公司青岛啤酒又开始对外“买酒”,这次看中的是黄酒。 5月7日晚间,...
炒腐竹最简单的做法,炒腐竹最简... 炒腐竹最简单的做法教程 特点:食材简单、步骤少、耗时短,适合新手或快速备餐。 一、食材准备(2人份)...
痛心!30岁中国女游客五一期间... 5月7日 #一中国游客为捞相机 命丧87米深海底#的话题 引发关注 据悉,一名30岁的中国女游客在...
靖西崇左自驾游攻略:路线规划难... 启程:与天气预报的博弈(Departure: A Game with the Weather For...
【早安,海棠】5月必吃的几种水... 早安,海棠!‍ 今天是2025年5月7日‍ 星期三(农历四月初十) 海棠天气如何? 又有哪些健康小知...
摊煎饼,别光顾着调面糊,多加1... 哈喽,大家好,我又来教大家做快手早饭了。 今天教大家做薄薄脆脆的煎饼,搭配着蔬菜,用煎饼把配菜卷起来...
原创 麻... 麻辣肉片是一道经典的川菜,以其麻辣鲜香、肉质嫩滑而深受食客喜爱。这道菜的关键在于肉片的腌制、麻辣调料...
吐峪沟玩水胜地,春天溪涧清凉解... 一、初识吐峪沟 春天的气息悄然弥漫,阳光洒在大地上,为万物披上一层金色的薄纱。周末清晨,我和好友小林...
洪江融媒丨【不去远方 就来洪江... 今年“五一”假期,洪江市以丰富文旅活动与独特景观吸引游客60.96万人次,实现旅游收入10045.9...
贵阳各区市县“五一”旅游成绩单... 2025年“五一”假期,贵阳各区市县文旅活动精彩纷呈。云岩区音乐与美食激活旅游热潮,南明区音乐市集与...
原创 朱... 嘿,亲爱的家人们,五一小长假简直成了明星们的“自由日”!熟悉的主持人朱丹也带着宝贝儿子飞奔到海南,开...
别再犹豫了!解锁深圳N种玩法,... 喂喂喂!各位在水泥森林里辛勤耕耘的“打工人”们,五一小长假你们是在家“葛优瘫”刷手机,还是勇敢地加入...
周末母亲节,打算陪老妈过节,做... 这个周末就是母亲节了,这次打算回老家陪母亲过节。民以食为天这句话说的没错,不管日子过得如何,总是少不...
酸奶消费警示提示 为帮助广大消费者 正确选购酸奶 玉溪市市场监督管理局 玉溪市消费者协会 发布如下消费提示 一、选购酸...
原创 比... 导语:比芋头便宜、比红薯营养,夏天要使劲吃!一养颜、二补钾、三润肠 大家好,我是傻姐美食,春夏秋冬,...
当孩子爱上烘焙,成绩不好也不是... 作为家长,孩子成长路上的每一个转折点都牵动着我的心。孩子初中成绩不理想,中考后进入技工类学校,本以为...
28款家常菜谱推荐,营养健康又... 在忙碌的生活中,为家人准备一顿营养健康又美味的家常饭菜,是一份无比温馨的心意。接下来,为您推荐 28...
阜新十大特色名菜,一口咬下去全... 要说辽宁哪个城市最有“隐藏剧情”,阜新必须榜上有名。 这地儿早在辽代就是契丹王朝的“中京”,也就是陪...