LeetCode 0808. 分汤:好题【感叹号】
创始人
2024-02-06 01:16:10
0

【LetMeFly】808.分汤:好题!

力扣题目链接:https://leetcode.cn/problems/soup-servings/

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

  1. 提供 100ml汤A0ml汤B
  2. 提供 75ml汤A25ml汤B
  3. 提供 50ml汤A50ml汤B
  4. 提供 25ml汤A75ml汤B

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

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

需要返回的值: 汤A 先分配完的概率 +  汤A和汤B 同时分配完的概率 / 2。返回值在正确答案 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​​​​​​​

方法一:特判 + 动态规划

我们将“一份”汤水视为25ml

因“不足时尽可能分配”,故n ml汤水相当于⌈25n⌉\lceil\frac{25}{n}\rceil⌈n25​⌉份

令dp[i][j]dp[i][j]dp[i][j]为“分配前A有i ml,B有j ml”的情况下“要求的概率”(这里要求的概率就是“汤A先分配完的概率 + 汤A和汤B同时分配完的概率 / 2”)

那么我们就能得到状态转移方程:

dp[i][j]=14×(dp[i−4][j]+dp[i−3][j−1]+dp[i−2][j−2]+dp[i−1][j−3])dp[i][j] = \frac14\times(dp[i - 4][j] + dp[i - 3][j - 1] + dp[i - 2][j - 2] + dp[i - 1][j - 3])dp[i][j]=41​×(dp[i−4][j]+dp[i−3][j−1]+dp[i−2][j−2]+dp[i−1][j−3])

这是因为初始值是[i][j][i][j][i][j]的时候,一次操作会等概率得到[i−4][j][i - 4][j][i−4][j]、[i−3][j−1][i - 3][j - 1][i−3][j−1]、[i−2][j−2][i - 2][j - 2][i−2][j−2]、[i−1][j−3][i - 1][j - 3][i−1][j−3]这四种情况。

注意,假如A汤不足333份,那么[i−3][i - 3][i−3]就由000替换。还是因为那句“不足时尽可能分配”,想取333份A但A不足三份的话,就把A取完(变成0)

最后考虑一下初始值:

  • 若初始的时候A和B的量都为0,那么“汤A和汤B同时分配完的概率”为1,“汤A先分配完的概率”为0,“汤A先分配完的概率 + 汤A和汤B同时分配完的概率 / 2”为0+1/2=0.50+1/2=0.50+1/2=0.5
  • 若初始的时候A为0但B的量不为0,那么“汤A先分配完的概率”为1,“汤A和汤B同时分配完的概率”为0,“汤A先分配完的概率 + 汤A和汤B同时分配完的概率 / 2”为1+0/2=11+0/2=11+0/2=1

复杂度分析:

完了,这DP的复杂度为O(n2)O(n^2)O(n2)咋办?

不用怕,注意“4种方案中”,“不存在先分配 100 ml 汤B 的操作”也就是说A被分配更多的概率更大。当nnn足够大时,AAA先分配完的概率接近于111

我们可以手动尝试一下

int main() {int n;while (cin >> n) {Solution sol;cout << sol.soupServings(n) << endl;}return 0;
}

当n≥5000n\geq5000n≥5000时(甚至更小),得到概率为0.99999.xx0.99999.xx0.99999.xx

满足题目“返回值在正确答案10−510^{-5}10−5的范围内将被认为是正确的”

因此,当nnn足够大时,直接返回111即可。

  • 时间复杂度O(n2)O(n^2)O(n2)或O(1)O(1)O(1)。当n≥5000n\geq 5000n≥5000时时间复杂度为O(1)O(1)O(1),否则为O(n2)O(n^2)O(n2)
  • 空间复杂度:同时间复杂度

看似O(n2)O(n^2)O(n2)的做法,通过了数据量10910^9109的题目。所以说这题很妙。

AC代码

C++

class Solution {
public:double soupServings(int n) {if (n >= 5000)return 1;n = n / 25 + (n % 25 != 0);vector> dp(n + 1, vector(n + 1, 0));for (int j = 1; j <= n; j++) {dp[0][j] = 1;}dp[0][0] = 0.5;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = 0.25 * (dp[max(0, i - 4)][j] + dp[max(0, i - 3)][max(0, j - 1)] + dp[max(0, i - 2)][max(0, j - 2)] + dp[max(0, i - 1)][max(0, j - 3)]);}}return dp[n][n];}
};

result

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127973526

相关内容

热门资讯

教育实习生自我鉴定 教育实习生自我鉴定(通用11篇)  自我鉴定是个人对一个时间段的自我总结,自我鉴定可以让我们对自己有...
个人思想道德品质自我评价 个人思想道德品质自我评价(通用15篇)  在日常学习、工作和生活中,许多人都需要写自我评价,自我评价...
大专学生毕业自我鉴定 大专学生毕业自我鉴定范文(精选19篇)  自我鉴定是对自己过去某一阶段的学习或工作的自我分析和总结,...
工作通用自我评价 工作通用自我评价  在生活、工作和学习中,我们都不可避免地要写自我评价,自我评价直接影响学习和参与社...
医德考评自我评价 医德考评自我评价11篇  在学习、工作、生活中,我们都需要频繁使用自我评价,自我评价具有重要的社会功...
军训训练自我鉴定 军训训练自我鉴定(精选8篇)  自我鉴定即为自我总结,自我鉴定使我们及时找出错误并改正,不妨让我们用...
大学生毕业登记表自我鉴定 大学生毕业登记表自我鉴定(通用17篇)  自我鉴定是个人在一个时期的自我总结,写自我鉴定有利于我们工...
幼师专业自我鉴定 幼师专业自我鉴定(通用14篇)  自我鉴定是个人对一个时期的学习或工作进行自我总结,它可以帮助我们了...
用英文自我评价 用英文自我评价(通用14篇)  无论是身处学校还是步入社会,我们经常会被要求写一份自我评价,自我评价...
学员自我鉴定 学员自我鉴定七篇  自我鉴定是个人在一个时期的自我总结,自我鉴定可以提升自身总结能力,因此好好准备一...
见习自我鉴定 见习自我鉴定(精选16篇)  自我鉴定是个人在一个时期对自己的学习或工作生活的自我总结,自我鉴定使我...
大一自我鉴定总结 大一自我鉴定总结  自我总结是一个人在某个阶段的学习和工作生活等表现的一个自我总结,写自我总结有利于...
实习转正自我评价 实习转正自我评价 实习转正自我评价 本文由自我评价网提供参考! 转眼间2个月试用期已接近尾声,首先感...
护理毕业生自我鉴定 精选护理毕业生自我鉴定4篇  自我鉴定是个人对一个时间段的自我总结,自我鉴定就可以促使我们思考,因此...
电大毕业自我鉴定 有关电大毕业自我鉴定汇编5篇  自我鉴定是对一个阶段的学习或工作进行回顾检查并分析评价,自我鉴定可以...
电大毕业生自我鉴定 【精品】电大毕业生自我鉴定4篇  正常来讲,自我鉴定即为自我总结,自我鉴定可以使我们更有效率,为此要...
自我评价五年级作文 自我评价五年级作文自我评价五年级作文1  在日复一日的学习、工作或生活中,我们或多或少都会遇到需要写...
护理实习自我鉴定 护理实习自我鉴定15篇  自我鉴定是对自己的政治思想、工作业务、学习生活等方面情况进行评价与描述,自...
高三学生综合素质自我评价 高三学生综合素质自我评价  自我评价是高中生根据自己综合素质情况的总结,可以全面发展自己的能力。下面...
毕业的自我鉴定 毕业的自我鉴定范文(精选20篇)  自我鉴定就是把一个时间段的个人情况进行一次全面系统的总结,写自我...