【动态规划】【C++算法】2188. 完成比赛的最少时间

作者推荐

【动态规划】【前缀和】【C++算法】LCP 57. 打地鼠

本文涉及知识点

动态规划汇总

LeetCode2188. 完成比赛的最少时间

给你一个下标从 0 开始的二维整数数组 tires ,其中 tires[i] = [fi, ri] 表示第 i 种轮胎如果连续使用,第 x 圈需要耗时 fi * ri(x-1) 秒。
比方说,如果 fi = 3 且 ri = 2 ,且一直使用这种类型的同一条轮胎,那么该轮胎完成第 1 圈赛道耗时 3 秒,完成第 2 圈耗时 3 * 2 = 6 秒,完成第 3 圈耗时 3 * 22 = 12 秒,依次类推。
同时给你一个整数 changeTime 和一个整数 numLaps 。
比赛总共包含 numLaps 圈,你可以选择 任意 一种轮胎开始比赛。每一种轮胎都有 无数条 。每一圈后,你可以选择耗费 changeTime 秒 换成 任意一种轮胎(也可以换成当前种类的新轮胎)。
请你返回完成比赛需要耗费的 最少 时间。
示例 1:
输入:tires = [[2,3],[3,4]], changeTime = 5, numLaps = 4
输出:21
解释:
第 1 圈:使用轮胎 0 ,耗时 2 秒。
第 2 圈:继续使用轮胎 0 ,耗时 2 * 3 = 6 秒。
第 3 圈:耗费 5 秒换一条新的轮胎 0 ,然后耗时 2 秒完成这一圈。
第 4 圈:继续使用轮胎 0 ,耗时 2 * 3 = 6 秒。
总耗时 = 2 + 6 + 5 + 2 + 6 = 21 秒。
完成比赛的最少时间为 21 秒。
示例 2:
输入:tires = [[1,10],[2,2],[3,4]], changeTime = 6, numLaps = 5
输出:25
解释:
第 1 圈:使用轮胎 1 ,耗时 2 秒。
第 2 圈:继续使用轮胎 1 ,耗时 2 * 2 = 4 秒。
第 3 圈:耗时 6 秒换一条新的轮胎 1 ,然后耗时 2 秒完成这一圈。
第 4 圈:继续使用轮胎 1 ,耗时 2 * 2 = 4 秒。
第 5 圈:耗时 6 秒换成轮胎 0 ,然后耗时 1 秒完成这一圈。
总耗时 = 2 + 4 + 6 + 2 + 4 + 6 + 1 = 25 秒。
完成比赛的最少时间为 25 秒。
提示:
1 <= tires.length <= 105
tires[i].length == 2
1 <= fi, changeTime <= 105
2 <= ri <= 105
1 <= numLaps <= 1000

动态规划

ri大于2,就算fi为1。20圈后,用时就大于等于10^6,不如:换新轮胎只跑一圈。
一个轮胎跑i圈,只需要考虑用时最短的那种轮胎。
轮胎+圈数只需要考虑不到20种状态

动态规划的状态表示

dp[j] 使用前i+1种状态需要的最少时间,包括换轮胎的时间。
时间复杂度:O(numLaps 20)

动态规划的转移方程

dp[j+i] = min(,dp[j]+useTime)

动态规划的初始值

dp[0] = 0,其它1e9。

动态规划的填表顺序

依次处理不到20种状态。

动态规划的返回值

dp.back()-changeTime

代码

核心代码

template<class ELE,class ELE2>
void MinSelf(ELE* seft, const ELE2& other)
{*seft = min(*seft,(ELE) other);
}template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}class Solution {
public:int minimumFinishTime(vector<vector<int>>& tires, int changeTime, int numLaps) {		vector<long long> vCurTireTime;for (const auto& v : tires){	vCurTireTime.emplace_back(v[0]);}auto vTotalTireTime = vCurTireTime;vector<long long> useTime = { 0,*std::min_element(vCurTireTime.begin(),vCurTireTime.end()) };for(int q = 2; q <= numLaps ;q++ ){for (int i = 0 ; i < vCurTireTime.size();i++ ){vCurTireTime[i] *= tires[i][1];MinSelf(&vCurTireTime[i], m_llNotMay);vTotalTireTime[i] += vCurTireTime[i];MinSelf(&vTotalTireTime[i], m_llNotMay);}const long long llMin = *std::min_element(vTotalTireTime.begin(), vTotalTireTime.end());if (llMin >= (useTime[1] + changeTime) * q){break;}useTime.emplace_back(llMin);}vector<long long> dp(numLaps + 1, m_llNotMay);dp[0] = 0;for (int i = 1; i < useTime.size(); i++){for (int pre = 0; pre < dp.size(); pre++){const int cur = pre + i;if (cur < dp.size()){MinSelf(&dp[cur], dp[pre] + useTime[i] + changeTime);}}}return (int)(dp.back()-changeTime);}const long long m_llNotMay = 2e9;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	vector<vector<int>> tires;int changeTime, numLaps;{Solution sln;tires = { {2,3},{3,4} }, changeTime = 5, numLaps = 4;auto res = sln.minimumFinishTime(tires, changeTime, numLaps);Assert(res,21);}{Solution sln;tires = { {1,10},{2,2},{3,4} }, changeTime = 6, numLaps = 5;auto res = sln.minimumFinishTime(tires, changeTime, numLaps);Assert(res, 25);}{Solution sln;tires = { {100000, 2}, { 10000,10000 }, { 1,2 }, { 1,10000 } }, changeTime = 10000, numLaps = 1000;auto res = sln.minimumFinishTime(tires, changeTime, numLaps);Assert(res, 1085253);}{Solution sln;tires = { {100000,2},{10000,10000},{1,2},{1,10000} }, changeTime = 1, numLaps = 1;auto res = sln.minimumFinishTime(tires, changeTime, numLaps);Assert(res, 1);}}

2023年2月

class Solution {
public:
int minimumFinishTime(vector<vector>& tires, int changeTime, int numLaps) {
m_vNumLapUseMinTime.resize(20, m_iNotMay);
for (const auto& v : tires)
{
long long iNeedTime = v[0];
int iPre = 0;
for (int j = 0; j < 20; j++)
{
if (0 != j)
{
iNeedTime = iNeedTime*((long long)v[1]);
}
if (iNeedTime >= m_vNumLapUseMinTime[0] + changeTime)
{
break;
}
iPre += iNeedTime;
m_vNumLapUseMinTime[j] = min(m_vNumLapUseMinTime[j], (int)iPre);
}
}
int iVilidNum = 0;
for (const auto& i : m_vNumLapUseMinTime)
{
if (m_iNotMay != i)
{
iVilidNum++;
}
}
vector dp(numLaps + 1, m_iNotMay);
dp[0] = 0;
for (int preNumLaps = 0; preNumLaps < numLaps; preNumLaps++)
{
for (int j = 0; j < iVilidNum; j++) {
const int iNewNumLaps = preNumLaps + j + 1;
if (iNewNumLaps > numLaps)
{
continue;
}
dp[iNewNumLaps] = min(dp[iNewNumLaps], dp[preNumLaps] + m_vNumLapUseMinTime[j] + changeTime);
}
}
return dp[numLaps] - changeTime;
}
vector m_vNumLapUseMinTime;
const int m_iNotMay = 1000 * 1000 * 1000;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Xshell

更改背景颜色 多个会话同时执行命令 查看 -> 撰写 -> 撰写窗格

【Spring】GoF 之工厂模式

一、GoF 23 设计模式简介 设计模式&#xff1a;一种可以被重复利用的解决方案 GoF&#xff08;Gang of Four&#xff09;&#xff0c;中文名——四人组 《Design Patterns: Elements of Reusable Object-Oriented Software》&#xff08;即《设计模式》一书&#xff09;&…

企业级人脸属性检测解决方案

在当今数字化、智能化的时代背景下&#xff0c;人脸识别技术已经成为众多行业不可或缺的一部分。美摄科技&#xff0c;作为人脸识别技术的领先者&#xff0c;为企业提供了一整套先进且高效的人脸属性检测解决方案。 美摄科技的人脸属性检测解决方案&#xff0c;基于深度学习算…

Vue-Vue3 集成编辑器功能

1、安装依赖 编辑器插件需要安装 wangeditor/editor 和 wangeditor/editor-for-vue 两个插件 npm install wangeditor/editor --savevue3运行如下命令安装 npm install wangeditor/editor-for-vuenext --savevue2运行如下命令安装 npm install wangeditor/editor-for-vue -…

Java强训day15(选择题编程题)

选择题 自连接使用一张表编程题 题目1 import java.util.Scanner;public class Main { public static int res(int n) {StringBuffer s new StringBuffer();while(n!0) {s.append(n%2);n/2;}int sum 0;String ss s.reverse().toString();for(int i0;i<ss.length()…

C语言的循环结构

目录 前言 1.三种循环语句 1.while循环 2.for循环 2.1缺少表达式的情况 3.do while循环 2.break语句和continue语句 2.1在while循环中 2.2在for循环中 2.3在do while 循环中 3.循环的嵌套 4.go to语句 前言 C语⾔是结构化的程序设计语⾔&#xff0c;这⾥的结构指的是…

nginx + DNS域名解析

配置链接: Nginx 安装配置 | 菜鸟教程 安装完nginx后&#xff0c;访问&#xff1a; cd /usr/local/nginx/sbin/ 然后使用./nginx可使用nginx。 访问:http://服务器的ip地址后出现 因为访问IP地址很繁琐&#xff0c;需要记忆ip的数字地址&#xff0c;因此需要给它一个通俗的…

MyBatis 实现动态 SQL

MyBatis 中的动态 SQL 就是SQL语句可以根据不同的情况情况来拼接不同的sql。 本文会介绍 xml 和 注解 两种方式的动态SQL实现方式。 XML的实现方式 先创建一个数据表&#xff0c;SQL代码如下&#xff1a; DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo (id int(1…

Mac上几款好用的MacBook视频播放器

使用Mac电脑时&#xff0c;视频播放器可以说是我们使用频率最高的软件之一了&#xff0c;不管是工作时看视频资料还是在家里看下载好的电影&#xff0c;都需要用到视频播放器&#xff0c;本文中我们就来推荐几款好用的Macbook视频播放器&#xff0c;总有一款适合你&#xff01;…

数据结构——B/顺序表和链表

&#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只是时间问题。 ​ 1.线性表 线性表&#xff08;linear list&…

QXlsx Qt操作excel(1)

QXlsx 是一个用于处理Excel文件的开源C库。它允许你在你的C应用程序中读取和写入Microsoft Excel文件&#xff08;.xlsx格式&#xff09;。该库支持多种操作&#xff0c;包括创建新的工作簿、读取和写入单元格数据、格式化单元格、以及其他与Excel文件相关的功能。 关于QXlsx的…

SQL拆分字段内容(含分隔符)

问题描述&#xff1a; 在做数据迁移的过程中&#xff0c;我们希望对表中的某个字段根据分隔符进行拆分&#xff0c;得到多条数据&#xff0c;原代码有点意思&#xff0c;因此记录一下。 我们假设某条数据如下&#xff1a; IDSTRS1公司名称不能小于四个字&#xff0c;行业类别…

【OrangePi Zero2的系统移植】OrangePi Zero2 SDK说明

一、使用环境要求 二、获取Linux SDK 三、首次编译完整SDK 基于OrangePi Zero2的系统移植 之前我们讲解香橙派的使用时&#xff0c; 都是直接在香橙派上进行代码编译&#xff0c; 但在实际的项目开发过程中&#xff0c;更多 的还是使用交叉编译环境进行代码的编译。再编译完成…

卷积层Conv1d包含的元素分别是什么,经过卷积层,数据的形状发生变化吗?

nn.Conv1d 是一个一维卷积层&#xff0c;它通常用于处理序列数据&#xff0c;如时间序列或文本数据。这个层包含以下主要元素&#xff1a; 输入通道数&#xff08;In_channels&#xff09;&#xff1a;这是输入数据的通道数。对于单通道数据&#xff08;如灰度图像或单变量时间…

医学三基答案在哪搜?4个大学生必备的搜题 #知识分享#职场发展

今天&#xff0c;我将分享一些受欢迎的、被大学生广泛使用的日常学习工具&#xff0c;希望能给你的学习生活带来一些便利和启发。 1.颐博咨询 这是一个网站 找题好用的在线搜题站,快考不限次搜题助手,问题截图搜题软件,练题通关考试试题大全。 2.题小聪 这是一个公众号 这…

macbookair怎么清理内存 ?如何利用 CleanMyMac X 进行系统清理

macbookair怎么清理内存 清理MacBook Air的内存可以通过以下几种方法&#xff1a; 优化储存空间。在MacBook Air上&#xff0c;可以通过“优化储存空间”来释放空间。这包括将文件储存在iCloud中&#xff0c;如桌面、文稿和iCloud信息&#xff0c;以及自动移除在iCloud中观看…

CSP-202203-1-未初始化警告

CSP-202203-1-未初始化警告 难点&#xff1a;时间复杂度 【核心】&#xff1a;统计输入的k组“赋值”中&#xff0c;右值不为0且未在先前作为左值出现过的次数【坑!】本题直接通过暴力枚举时间复杂度很可能过不了 【90分思路】 定义数组 initialized 用来存储已经处理过的左…

从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[3…

Flink CDC 与 Kafka 集成:Snapshot 还是 Changelog?Upsert Kafka 还是 Kafka?

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…

MySQL-SQL优化

文章目录 1. SQL性能分析1.1 SQL执行频率1.2 慢查询日志1.3 profile详情1.4 explain 2. SQL优化2.1 Insert 优化2.2 Group By 优化2.3 Order By 优化2.4 Limit 优化2.5 Count() 优化2.6 Update 优化 3. 拓展3.1 请你说一下MySQL中的性能调优的方法&#xff1f;3.2 执行 SQL 响应…