LeetCode 0808. 分汤:好题【感叹号】

news2025/1/18 18:55:34

【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汤水相当于 ⌈ 25 n ⌉ \lceil\frac{25}{n}\rceil n25

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

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

d p [ i ] [ j ] = 1 4 × ( d p [ i − 4 ] [ j ] + d p [ i − 3 ] [ j − 1 ] + d p [ i − 2 ] [ j − 2 ] + d p [ 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[i4][j]+dp[i3][j1]+dp[i2][j2]+dp[i1][j3])

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

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

最后考虑一下初始值:

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

复杂度分析:

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

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

我们可以手动尝试一下

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

n ≥ 5000 n\geq5000 n5000时(甚至更小),得到概率为 0.99999. x x 0.99999.xx 0.99999.xx

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

因此,当 n n n足够大时,直接返回 1 1 1即可。

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

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

AC代码

C++

class Solution {
public:
    double soupServings(int n) {
        if (n >= 5000)
            return 1;
        n = n / 25 + (n % 25 != 0);
        vector<vector<double>> dp(n + 1, vector<double>(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google Earth Engine(GEE)—— 各矿区时序NDVI变化图(包含具体的运行函数)

函数: ee.Filter.eq(name, value) Filter to metadata equal to the given value. Returns the constructed filter. Arguments: name (String): The property name to filter on. value (Object): The value to compare against. Returns: Filter ui.Chart.image.s…

7、Jedis测试

文章目录7、Jedis测试7.1. Jedis所需要的jar包7.2. 连接Redis注意事项7.3. Jedis常用操作7.3.1. 创建动态的工程7.3.2. 创建测试程序7.4. 测试相关数据类型7.4.1. Jedis-API&#xff1a;Key7.4.2. Jedis-API&#xff1a;String7.4.3. Jedis-API&#xff1a;List7.4.4. Jedis-AP…

葡萄糖-聚乙二醇-6-羧甲基荧光素 Glucose-PEG-6-FAM

葡萄糖-聚乙二醇-6-羧甲基荧光素 Glucose-PEG-6-FAM 中文名称&#xff1a;葡萄糖-6-羧甲基荧光素 英文名称&#xff1a;Glucose-6-FAM 别称&#xff1a;6-羧甲基荧光素标记葡萄糖&#xff0c;6-羧甲基荧光素-葡萄糖 PEG接枝修饰葡萄糖 Glucose-PEG-6-FAM 葡萄糖-聚乙二醇…

需求收集方法工具,以及进行需求分析的6大要素

通过本文你将了解&#xff1a;1、需求管理流程包括哪四个步骤&#xff1b;2、如何进行需求收集&#xff1b;3、如何进行需求分析&#xff1f;4、如何进行需求分发&#xff1b;5、如何进行需求验证&#xff1b;6、有哪些辅助软件需求管理的工具系统&#xff1f;一、需求管理包括…

MyBatis核心配置文件

1.environments 注 : environments下面可以配置多个环境 , 需要使用哪个环境default里面的参数就对应哪个Id. 2.properties 配置连接 方法一 :(直接配置参数) 方法二 :(使用properties配置文件) (1)创建一个 properties 文件 , 在里面配置连接 (2)在核心配置文件中配置使用p…

41.朴素贝叶斯Naive Bayes公式推导与理解+求解公园凉鞋问题(借助文氏图)

朴素贝叶斯是基于概率论统计学的分类算法。 贝叶斯理论是指根据一个已发生事件的概率&#xff0c;计算另一个事件的发生概率。 目录 1.相关概念 1.1先验概率 应用举例 1.2条件概率 应用举例 1.3全概率公式 应用举例 1.4后验概率 应用举例 2.课堂笔记 ​ 3.文…

ubuntu16.04+cuda10.0+cudnn7.6+tensorflow_gpu-1.11.0环境安装

为了搭深度学习环境,又装了一遍各种库,在此记录安装版本和流程. ubuntu16.04cuda10.0cudnn7.6tensorflow_gpu-1.11.0环境安装1 安装NVIDIA显卡2 安装CUDA10.03 安装CUDNN4 安装tensorflow_gpu-1.11.01 安装NVIDIA显卡 查看自己的显卡型号: lspci |grep -i nvidianvidia官网:h…

linux安装Zookeeper3.5.7详解

官网下载链接&#xff1a;Apache ZooKeeper 如下图可以下载历史版本 然后找到3.5.7版本&#xff0c;直接下载即可然后将Zookeeper拷贝到一个文件夹下&#xff0c;这里我选择的是/opt/software文件夹 然后将其解压到指定目录下 tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C …

让你全方位了解tftp协议,学tftp协议不再难

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;端口号为69&#xff0c;是一种高效的文件传输方式。 其目标是在UDP之上建立一个类似于FTP的但仅支持文件上传和下载功能的传输协议&a…

【Jmeter基础篇】06:HTTP信息头管理器的使用 | 梯度加压性能测试

一、什么是信息头&#xff1f; 其实就是请求头&#xff0c;它会随着我们的HTTP请求一起发送到服务器。 二、使用场景 需要传输cookie&#xff0c;token或其他某些信息&#xff0c;或是需要伪造请求头的时候。 三、实际案例 比如我在使用Apache Jmeter发送请求的时候&#…

【Hack The Box】linux练习-- Haircut

HTB 学习笔记 【Hack The Box】linux练习-- Haircut &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36…

Fiddler收费没得用?这款抓包神器 Github star 过万,一个字:香

关于抓包&#xff0c;那是测试人员必备技能之一了&#xff0c;通常我们会通过一些抓包工具来辅助我们测试、定位bug。 我最早接触并使用的就是 fiddler &#xff0c;不过目前最新版本已经要开始付费了&#xff0c;以前很老的那版我也不爱用了&#xff0c;这可咋整&#xff1f;…

软件测试投了几十份简历为什么没有面试邀约?

最近有不少人问&#xff0c;测试岗位&#xff0c;为啥投了简历却连一个面试机会都没有&#xff1f;如下图&#xff1a; 投3份简历没有回音&#xff0c;有可能是投的公司规模较大&#xff0c;你自身条件不过关&#xff08;如学历&#xff0c;年龄不符合要求&#xff09;。 投30…

网络是怎样连接的--DNS服务器查询原理

文章目录3.1 DNS服务器基本工作3.2 寻找相应的DNS服务器并获取ip地址3.3 通过缓存加快DNS服务器的响应3.1 DNS服务器基本工作 DNS服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应。 其中&#xff0c;来自客户端的查询消息包含以下3种信…

Java 面试题 —— 简单工厂、工厂方法、抽象工厂的区别

Java 面试题 —— 简单工厂、工厂方法、抽象工厂的区别 1、简单工厂模式 ​ 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff1a;又称为静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;它属于类创建型模式。 ​ 在简单工厂…

常见仿射变换矩阵

旋转&#xff08;Rotation&#xff09; def _get_rotation_matrix(rotate_degrees):radian math.radians(rotate_degrees)rotation_matrix np.array([[np.cos(radian), -np.sin(radian), 0.],[np.sin(radian), np.cos(radian), 0.], [0., 0., 1.]],dtypenp.float32)return r…

C# 学习之路(C# 的概念)

C# 学习之路&#xff08;C# 的概念&#xff09; - 什么是 C# C# 的发音是 “C sharp”&#xff0c;不是念作 “C 井”&#xff08;虽然&#xff0c;我在没有接触之前是念“C 井”&#x1f923;&#xff09;。C# 的第一个版本是 2002年发布的 C# 1.0&#xff0c;但到如今&#x…

Redis——》内存淘汰策略

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》内存淘汰策略一、内存淘汰策略二、设置缓存大小三、设置过期时间…

前端常见面试题

前端常见面试题大全前端本地存储的方式有哪些?JS 的参数是以什么方式进行传递的?js中的垃圾回收?作用域链?什么是闭包?原型 与 原型链js的继承判断一个数据是否为数组? > 数组的方法数组去重?this指向问题?Promise是什么? 构造函数 异步代码的容器手写promo深拷贝 …

AQS源码解析 2.简介 内部核心结构

AQS源码解析—简介 & 内部核心结构 AQS内部结构 简介 AbstractQueuedSynchronizer&#xff1a;AQS&#xff0c;抽象队列同步器。主要是为了解决线程锁竞争的问题。 AQS 原理图如下&#xff0c;其本质是一个双向链表/队列 多线程抢锁内部数据结构&#xff0c;如下 核…