2024.4.19力扣每日一题——准时抵达会议现场的最小跳过休息次数

2024.4.19

      • 题目来源
      • 我的题解
        • 方法一 动态规划+浮点数精度
        • 方法二 动态规划+不考虑浮点数精度问题

题目来源

力扣每日一题;题序:1883

我的题解

方法一 动态规划+浮点数精度

参考官方题解。
用 f[i][j]表示经过了 dist[0]到 dist[i−1]的 i 段道路,并且跳过了 j 次的最短用时。
在进行状态转移时,考虑最后一段道路 dist[i−1]是否选择跳过:

  • 如果没有跳过,那么状态转移方程为:
          f [ i ] [ j ] = ⌈ f [ i − 1 ] [ j ] + dist [ i − 1 ] speed ⌉ f[i][j] = \left\lceil f[i-1][j] + \frac{\textit{dist}[i-1]}{\textit{speed}} \right\rceil f[i][j]=f[i1][j]+speeddist[i1]
    其中 ⌈x⌉表示将 x向上取整。对于最后一段道路,无需等待到下一个整数小时,但由于题目中给定的 hoursBefore是一个整数,因此在状态转移方程中向上取整是不会影响结果的。
  • 如果跳过,那么状态转移方程为:
        f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + dist [ i − 1 ] speed f[i][j] = f[i-1][j-1] + \frac{\textit{dist}[i-1]}{\textit{speed}} f[i][j]=f[i1][j1]+speeddist[i1]

由于到达的时间尽可能早,因此需要选择这两种转移中的较小值,即:
f [ i ] [ j ] = min ⁡ { ⌈ f [ i − 1 ] [ j ] + dist [ i − 1 ] speed ⌉ , f [ i − 1 ] [ j − 1 ] + dist [ i − 1 ] speed } f[i][j] = \min \left\{ \left\lceil f[i-1][j] + \frac{\textit{dist}[i-1]}{\textit{speed}} \right\rceil, f[i-1][j-1] + \frac{\textit{dist}[i-1]}{\textit{speed}}\right\} f[i][j]=min{f[i1][j]+speeddist[i1],f[i1][j1]+speeddist[i1]}
需要注意的是,当 j=0 时,不能通过「跳过」进行转移;当 j=i 时,不能通过「没有跳过」进行转移;当 j>i 时,无法在 i 段道路内跳过超过 i 次,对应的状态不合法。
当计算完所有状态的值后,只需要找到最小的 j,使得 f[n][j]≤hoursBefore,这个 j即为最少需要跳过的次数。如果不存在这样的 jjj,那么返回 −1。
动态规划的细节

  • 动态规划的边界条件为 f[0][0]=0,表示初始(未走过任何道路)时的时间为 0。
    由于状态转移方程中的取值为 min⁡,因此可以将除了 f[0][0]以外所有的状态置为一个极大值 ∞ \infty ,方便进行转移。
    浮点数精度问题
    引入常量 eps表示一个极小值。在进行「向上取整」运算前,将待取整的浮点数减去 eps再进行取整,就可以避免上述的误差。
    同时,需要说明 eps 不会引入其它的问题。在本题中速度最大为 1 0 6 10^6 106,时间与速度成反比,那么 eps 的粒度只需要高于时间的精度 1 0 − 6 10^{-6} 106即可,取 1 0 − 7 10^{-7} 107 1 0 − 8 10^{-8} 108 都是可行的。
    最后在比较 f[n][j]≤hoursBefore时,也需要将左侧减去 eps或将右侧加上 eps,再进行比较。
    时间复杂度:O( n 2 n^2 n2)
    空间复杂度:O( n 2 n^2 n2)
public int minSkips(int[] dist, int speed, int hoursBefore) {int n=dist.length;double eps=1e-7;double[][] dp=new double[n+1][n+1];for(int i=0;i<=n;i++){Arrays.fill(dp[i],Double.MAX_VALUE);}dp[0][0]=0;for(int i=1;i<=n;i++){//跳跃次数for(int j=0;j<=i;j++){if(j!=i){dp[i][j]=Math.min(dp[i][j],Math.ceil(dp[i-1][j]+(double)dist[i-1]/speed-eps));}if(j!=0){dp[i][j]=Math.min(dp[i][j],dp[i-1][j-1]+(double)dist[i-1]/speed);}}}for(int i=0;i<=n;i++){if(dp[n][i]<hoursBefore+eps)return i;}return -1;
}
方法二 动态规划+不考虑浮点数精度问题

对所有的除法都乘以speed使其成为整数。将「必须休息并等待,直到下一个整数小时才能开始继续通过下一条道路」,那么当我们将上面的变量都乘以 speed 后,规定应当变更为「必须休息并等待,直到下一个 speed 的倍数小时才能开始继续通过下一条道路

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O( n 2 n^2 n2)

public int minSkips(int[] dist, int speed, int hoursBefore) {int n=dist.length;long[][] dp=new long[n+1][n+1];for(int i=0;i<=n;i++){Arrays.fill(dp[i],Long.MAX_VALUE);}dp[0][0]=0;for(int i=1;i<=n;i++){//跳跃次数for(int j=0;j<=i;j++){if(j!=i){dp[i][j] = Math.min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) / speed + 1) * speed);}if(j!=0){dp[i][j]=Math.min(dp[i][j],dp[i-1][j-1]+dist[i-1]);}}}for(int i=0;i<=n;i++){if(dp[n][i]<=(long)hoursBefore*speed)return i;}return -1;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

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

相关文章

ORACLE错误提示概述

OceanBase分布式数据库-海量数据 笔笔算数 保存起来方便自己查看错误代码。 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程…

PTA L2-047 锦标赛

题目 解析 把每一场比赛看作满二叉树的一个节点&#xff0c;父节点递归遍历子节点的结果&#xff0c;进行试填。 代码 #include <bits/stdc.h>using i64 long long;struct Node {int win, lose; };void solve() {int k;std::cin >> k;int siz (1 << k);…

【YOLOv8改进[Backbone]】使用MobileNetV3助力YOLOv8网络结构轻量化并助力涨点

目录 一 MobileNetV3 1 面向块搜索的平台感知NAS和NetAdapt 2 反向残差和线性瓶颈 二 使用MobileNetV3助力YOLOv8 1 整体修改 ① 添加MobileNetV3.py文件 ② 修改ultralytics/nn/tasks.py文件 ③ 修改ultralytics/utils/torch_utils.py文件 2 配置文件 3 训练 其他 …

如何查看项目中使用的Qt版本

如何查看项目中使用的Qt版本 1.点击左下角电脑按钮查看Qt版本。 2.点击左侧栏项目按钮查看Qt版本。

apipost、postman等工具上传图片测试flask、fastapi的文件api接口

参考&#xff1a;https://blog.csdn.net/qq_15821487/article/details/119354129 https://www.cnblogs.com/wyxjava/p/16076176.html 选择from-data&#xff0c;下拉选择file上传文件发送即可

MySQL-数据库基础

一、背景与基本使用 首先是登录方式&#xff0c;一般用 mysql -h 127.0.0.1 -P 3306 -u root -p mysql也是一种网络服务。 当然我们在本地登录时可以省去主机ip和端口号。 -h表示我们要登录mysql在哪个ip的主机上&#xff0c; -P表示端口号。 -u表示以谁的身份去登录。…

笔记:Python顺序结构 练习题

文章目录 前言一、什么是顺序结构&#xff1f;二、练习题1.题目2.填空题3.简答题4.编程题 总结 前言 本次笔记旨在帮助读者加深对Python编程语言中顺序结构和选择题的理解。在学习Python编程过程中&#xff0c;掌握程序的基本结构以及条件语句的使用至关重要。通过本次练习题&…

MyBatis使用PageHelper分页插件

1、不使用PageHelper分页插件 模块名&#xff1a;mybatis-012-page CarMapper接口package org.example.mapper;import org.apache.ibatis.annotations.Param; import org.example.pojo.Car;import java.util.List;public interface CarMapper {/*** 分页查询* param startInd…

Python中的字符串操作

Python 是一种简单易学且功能强大的编程语言&#xff0c;它在处理字符串方面提供了丰富的内置方法和函数。字符串是 Python 中最基本的数据类型之一&#xff0c;用于表示文本数据。本文将介绍 Python 中一些常用的字符串操作方法&#xff0c;并通过示例代码来展示它们的用法。 …

【爬虫】多线程爬取图片

多线程爬虫 多线程爬虫概述1.1 多线程的优势1.2 多线程的挑战 设计多线程爬虫1.1 项目设计1.2 项目流程1.3注意事项 总结 多线程爬虫概述 在当今信息爆炸的时代&#xff0c;网络爬虫&#xff08;Web Scraper&#xff09;已成为获取和分析网络数据的重要工具。而多线程爬虫&…

贪吃蛇游戏源码(VS编译环境)

贪吃蛇游戏源码&#xff08;VS编译环境&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C语言&#x1f353; &#x1f33c;文章目录&#x1f33c; 1. Snake.h 头文件 2. Snake.c 源文件 3. Test.c 头文件 1. Snake.h 头…

什么是promise?

一个对象&#xff0c;用来处理异步操作。使异步操作写的更优雅、更易于阅读。 从字面上理解&#xff0c;promise是承诺、许诺的意思。意思是使用promise后&#xff0c;不管成功还是失败肯定会有返回值。 promise有三种状态&#xff1a;pending&#xff08;进行中&#xff09;&a…

linux常用命令,没有最全,只有更全 【持续更新】

工作中linux是大家常用的&#xff0c;下面这些linux命令涵盖了工作中常用的&#xff0c;相信你百分百会用的到&#xff01; 文件和目录操作&#xff1a; ls&#xff1a;列出当前目录下的文件和子目录。 例如&#xff1a;ls -l 显示详细信息&#xff0c;ls -a 显示所有文件&…

Dubbo元数据中心

元数据中心为 Dubbo 中的两类元数据提供了存取能力&#xff1a;地址发现元数据、服务运维元数据。 一、地址发现元数据 Dubbo3 中引入了应用级服务发现机制用来解决异构微服务体系互通与大规模集群实践的性能问题&#xff0c;应用级服务发现将全面取代 2.x 时代的接口级服务发…

java的常规算法有那些?

在Java编程中&#xff0c;有一系列常规算法被广泛应用&#xff0c;这些算法涵盖了排序、搜索、字符串处理等多个领域。下面列出了一些基本的算法和它们在Java中的应用&#xff1a; 排序算法 冒泡排序&#xff1a;通过重复遍历待排序列&#xff0c;比较相邻元素&#xff0c;将…

C/C++易错知识点(4):static修饰变量和函数

static是C/C中一个非常容易混淆的语法&#xff0c;在不同的地方针对不同的对象有不同的效果。 它在大型项目中有至关重要的作用&#xff0c;需要我们详细研究。 1.变量 所有static修饰的变量的生命周期都是自调用它起到程序结束&#xff0c;期间这些变量都只会初始化一次 ①…

七牛云配置,图片上传、查看的使用(备忘)

修改配置文档 修改新创建的空间的地区名 访问设置为 公开&#xff0c;不然会有访问时间限制 检查 上传和查看的链接是否正确。

STL容器搜索:当直接访问STL容器时,如何执行有效和正确的搜索?

掌握STL容器搜索技巧:在C中实现高效和准确的数据访问 一、简介二、std::vector, std::deque, std::list三、std::map, std::multimap, std::set, std::multiset四、std::string六、总结 一、简介 本文主要了解如何在直接访问c容器时高效地进行搜索。在STL容器中搜索&#xff0…

5_vscode+valgrind+gdb调试程序

需求 项目程序, 读取串口数据, 出现程序崩溃问题valgrind 可以调试定位内存问题: 内存泄漏,非法地址访问,越界访问等内存问题vscode gdb 可视化调试效果, 比命令行简单快捷很多期望使用vscode valgrind gdb 调试程序内存异常, 崩溃退出的问题 环境准备 sudo apt install v…

【个人博客搭建】(5)Sqlsugar实体创建数据库数据

1、在appsettings.json文件中配置SqlServer数据库连接字符串信息。&#xff08;后续考虑添加MySQL数据库等类型&#xff09; "DBS": [/*对应下边的 DBTypeMySql 0,SqlServer 1,*/{"ConnId": "plateau.poetize.2024","DBType": 1,&qu…