【华为OD题库-107】编码能力提升计划-java
题目
为了提升软件编码能力,小王制定了刷题计划,他选了题库中的n道题,编号从0到n-1,并计划在m天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一题)
在小王刷题计划中,小王需要用time[i]的时间完成编号i的题目此外,小王还可以查看答案,可以省去该题的做题时间。为了真正达到刷题效果,小王每天最多直接看一次答案。我们定义m天中做题时间最多的一天耗时为T(直接看答案的题目不计入做题总时间)。请你帮小王求出最小的T是多少
输入描述
第一行输入为time,time[i]的时间完成编号i的题目
第二行输入为m,m表示几天内完成所有题目,1<= m<= 180
输出描述
最小耗时整数T
示例1:
输入
999,999,999
4
输出
0
说明
在前三天中,小王每天都直接看答案,这样他可以在三天内完成所有的题目并不花任何时间
示例2:
输入
1,2,2,3,5,4,6,7,8
5
输出
4
说明
第一天完成前3题,第3题看答案;
第二天完成第4题和第5题,第5题看答案;
第三天完成第6和第7题,第7题看答案;
第四天完成第8题,直接看答案;
第五天完成第9题,直接看答案
思路
同leetcode:LCP 12. 小张刷题计划
可从三种思路解决此题
- 回溯
排列组合参考:【JAVA-排列组合】一个套路速解排列组合题
列举所有可能的划分方法,找到最小的T(T为每种划分方法的和的最大值)
以数据1,2,2,3,5,4,6,7,8为例,加入要划分5组,那么需要找到4个数,在其前面划上|表示划分,如:
1,2,|2,3,|5,4,|6,7,|8,元数据被划分成了5组,按照此思路,|不能出现在第一个数字,因为不能有空的分组。所以dfs从1开始。
对于每种划分方案:计算每一段的结果(该和-该段最大值),得到最大的结果作为该种划分方案的结果
最后获取每种方案最小的结果即可
还有考虑特殊情况,比如输入的天数大于等于数组总长度,那么直接返回0即可(单个一组,每天都看答案即可),如果只有一天,也就不用划分,返回总长度-最大值即可
- 动态规划
定义dp[i][j]为选取数组的前i个数据划分为j段所能得到的最大连续子数组和减去该段最大值后的最小值。
在进行状态转移,考虑第j段的具体范围,我们可以枚举k,即前k个数分割为j-1段,而k+1到第i个数为第j段。这j段子数组和中的最大值就等于:dp[k][j-1]和sub(k+1,i)-max(k+1,i)中的较大值。其中sub(i,j)代表数组nums下标落在[i,j]范围的和,max(i,j)代表数组nums下标落在[i,j]的最大值。
由于最后要求的是最小值,所以dp可以初始化一个较大的值
上述步骤中要求dp[k][j-1]和sub(k+1,i)-max(k+1,i)中的较大值,当j=1时,会利用dp[0][0]求最大值,所以还需要给dp[0][0]赋一个较小的值,比如0。
最后返回dp[nums.length][m]即可,m为天数
同样的,需要考虑特殊情况,当输入的天数大于等于数组总长度,那么直接返回0即可
- 二分法
二分模板参考:【华为OD题库-046】生日礼物-java
由题可知,左边界为0(单个数据一组),右边界为sum-max(整体划分为一组)
题目需要找到满足条件的最小值,也就是找第一个满足条件的值(可直接利用二分模板),如果满足条件则right=mid,不满足条件则left=mid+1;
关键在于checked(nums,mid,k)方法,即怎么判定对于给定mid,是否满足条件?
假设nums可以划分为5组,每一组和不大于mid,那么其一定可以划分为6组,7组…(将前5组再次划分为更细的分组,只要最大分组不超过nums的长度即可),最后每组和也不大于mid。所以该方法的判定逻辑为:
遍历nums,如果累加和超过了mid,那么就需要新开分组,最后统计能够划分的分组数,如果得到的分组数不超过mid,那么就满足条件。
方法3的效率优于方法1和2
题解
- 回溯
package hwod;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class CodeImprovePlan {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int day = sc.nextInt();System.out.println(codeImprovePlan(nums, day));}private static int res = Integer.MAX_VALUE;private static int cnt;private static int codeImprovePlan(int[] nums, int day) {int size = nums.length;if (size <= day) return 0;if (day == 1) {int sum = 0, max = 0;for (int k = 0; k < nums.length; k++) {sum += nums[k];max = Math.max(nums[k], max);}return sum - max;}cnt = day-1;//划分day段,那么就是找day-1个数,在其前面划短杠表示分段LinkedList<Integer> path = new LinkedList<>();dfs(nums, 1, path);return res;}private static void dfs(int[] nums, int start, LinkedList<Integer> path) {if (path.size() == cnt) {ArrayList<Integer> list = new ArrayList<>(path);int curMax = 0;//基于当前分段得到的最大值int left, right;for (int i = 0; i <= list.size(); i++) {if (i == list.size()) {left = list.get(i - 1);right = nums.length;} else {right = list.get(i);left = i == 0 ? 0 : list.get(i - 1);}int maxTmp = 0, sumTmp = 0; //某段的最大值和累计和for (int k = left; k <right ; k++) {sumTmp += nums[k];maxTmp = Math.max(nums[k], maxTmp);}curMax = Math.max(curMax, sumTmp - maxTmp);}res = Math.min(curMax, res);return;}for (int i = start; i < nums.length; i++) {path.addLast(i);dfs(nums, i + 1, path);path.removeLast();}}
}
- 动态规划
package hwod;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class CodeImprovePlan {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int day = sc.nextInt();System.out.println(codeImprovePlan(nums, day));}//动态规划private static int codeImprovePlan(int[] nums, int day) {int size = nums.length;if(day>=size) return 0;int[][] dp = new int[size + 1][day + 1];for (int i = 0; i < size + 1; i++) {Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[0][0] = 1;int[] sub = new int[size + 1];for (int i = 0; i < nums.length; i++) {sub[i + 1] = sub[i] + nums[i];}for (int i = 1; i < size+1; i++) {for (int j = 1; j < day+1; j++) {for (int k = 0; k < i; k++) {dp[i][j] = Math.min(dp[i][j], Math.max(dp[k][j - 1], sub[i] - sub[k] - getMax(nums, k-1, i-1)));}}}return dp[size][day];}private static int getMax(int[] nums, int start, int end) {start = Math.max(0, start);int res = 0;for (int i = start; i<=end; i++) {res = Math.max(nums[i], res);}return res;}
}
- 二分法
package hwod;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;public class CodeImprovePlan {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int day = sc.nextInt();System.out.println(codeImprovePlan(nums, day));}//二分法private static int codeImprovePlan(int[] nums, int day) {int left = 0, right = 0, sum = 0, max = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];max = Math.max(max, nums[i]);}right = sum - max;while (left < right) {int mid = left + (right - left >> 1);if (checked(nums, mid, day)) {right = mid;} else {left = mid + 1;}}return left;}private static boolean checked(int[] nums, int mid, int day) {int cnt = 0, sum = 0, max = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];max = Math.max(nums[i], max);if (sum - max > mid) {cnt++;sum = nums[i];max = nums[i];}}return cnt + 1 <= day;//+1:加上最后一段未统计的分组}
}
推荐
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。
说明
本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
相关文章:
【华为OD题库-107】编码能力提升计划-java
题目 为了提升软件编码能力,小王制定了刷题计划,他选了题库中的n道题,编号从0到n-1,并计划在m天内按照题目编号顺序刷完所有的题目(注意,小王不能用多天完成同一题) 在小王刷题计划中,小王需要用time[i]的时…...
使用pytorch进行图像预处理的常用方法的详细解释
一般来说,我们在使用pytorch进行图像分类任务时都会对训练集数据做必要的格式转换和增广处理,对测试集做格式处理。 以下是常用的数据集处理函数: data_transform { "train": transforms.Compose([transforms.RandomResizedCro…...
天线根据什么进行分类
天线是信息化时代的一个标准,广播信号塔,通信基站塔,卫星天线还有每天都要用到的手机,都是含有天线的,只是各种天线的作用不同,大小不同。今天给大家说一下,天线是如何分类的。 1.按工作性质可…...

JavaScript:正则表达式
JavaScript:正则表达式 什么是正则表达式正则表达式语法定义正则表达式判断是否有匹配的字符串查找匹配的字符串 正则表达式匹配法则元字符边界符量词字符类 什么是正则表达式 正则表达式用于匹配字符串中字符的组合模式。 正则表达式会依据其自身语法,…...

【Linux】深挖进程地址空间
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉【Linux】进程地址空间 > 毒鸡汤ÿ…...

SVM(支持向量机)-机器学习
支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习算法。它属于机器学习中的一类强大而灵活的模型,广泛应用于模式识别、图像分类、自然语言处理等领域。 基本原理: SVM的基本原理是通过找到能够有效分…...
解决生成的insert语句内有单引号的情况
背景 因为Mybatis-Plus的saveBatch()方法的批量插入其实也是循环插入,而不是真正的一个SqlSession完成的批插,效率很低。所以我们在写批量插入的时候是自己实现了一个工具类去生成批量插入的sql再去执行,但是会遇到有些文本里有单引号导致插…...
【Linux 程序】1. 程序构建
文章目录 【 1. 配置 】【 2. 编译 】makefile编写的要点makefile中的全局自变量CMake编译依赖的库g编译 【 3. 安装 】 一般源代码提供的程序安装需要通过配置、编译、安装三个步骤; 配置。检查当前环境是否满足要安装软件的依赖关系,以及设置程序安装所…...

GLTF 编辑器实现逼真3D动物毛发效果
在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 要实现逼真的3D动物毛发效果,可以采用以下技术和方法&…...
【Go语言入门:Go语言的方法,函数,接口】
文章目录 4.Go语言的方法,函数,接口4.1. 方法4.1.1. 指针接受者4.1.2. 值接收者和指针接收者有什么区别?4.1.3. 方法 4.2. 接口4.2.1. 接口定义 4.3. 函数4.3.1. 函数介绍 4.Go语言的方法,函数,接口 4.1. 方法 4.1.1…...

vue-cli3/webpack打包时去掉console.log调试信息
文章目录 前言一、terser-webpack-plugin是什么?二、使用配置vue-cli项目 前言 开发环境下,console.log调试信息,有助于我们找到错误,但在生产环境,不需要console.log打印调试信息,所以打包时需要将consol…...

企业品牌推广在国外媒体投放的意义和作用何在?
海外广告投放是企业在国际市场推广的重要战略,具有多种形式,包括社交媒体广告、短视频广告、电视广告等。这些广告形式在传播信息、推动销售、塑造品牌形象等方面发挥着独特的作用。 其中软文发稿是一种注重叙事和信息传递的广告形式,对于企…...

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)
在处理shp数据时, 又是我们需要知道许多个shp字段的批量计算,例如计算shp的总面积、面积平均值等,但是单个查看shp文件的属性进行汇总过于繁琐,因此可以借助建模批处理来计算。 首先准备数据:一个含有多个shp的文件夹。…...

代码质量评价及设计原则
1.评价代码质量的标准 1.1 可维护性 可维护性强的代码指的是: 在不去破坏原有的代码设计以及不引入新的BUG的前提下,能够快速的修改或者新增代码. 不易维护的代码指的是: 在添加或者修改一些功能逻辑的时候,存在极大的引入新的BUG的风险,并且需要花费的时间也很长. 代码可…...
编程笔记 html5cssjs 012 HTML分块
编程笔记 html5&css&js 012 HTML分块 一、HTML 块级元素二、HTML 内联元素三、HTML <div> 元素四、HTML <span> 元素五、HTML<article>元素六、<article>元素和<div>元素的区别与联系小结 像报纸排版一样,很多时候需要把平面…...

【持续更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】
目录 (1)项目可行性分析 (2)需求描述 (3)界面原型 (4)数据库设计 (5)后端工程 接下来我们使用uniappspringboot实现一个简单的前后端分离的小项目----个…...

nginx+rsyslog+kafka+clickhouse+grafana 实现nginx 网关监控
需求 我想做一个类似腾讯云网关日志最终以仪表方式呈现,比如说qps、p99、p95的请求响应时间等等 流程图 数据流转就像标题 nginx ----> rsyslog ----> kafka —> clickhouse —> grafana 部署 kafka kafka 相关部署这里不做赘述,只要创…...
User maven 通过什么命令能查到那个包依赖了slf4j-simple-1.7.36.jar
要在 Maven 项目中查找哪个包依赖了 slf4j-simple-1.7.36.jar,您可以使用 Maven 的依赖树命令 mvn dependency:tree。这个命令会展示项目所有依赖的层次结构,包括传递依赖(即一个依赖的依赖)。然后,您可以搜索或过滤输…...

什么牌子冻干猫粮性价比高?性价比高的五款冻干猫粮牌子推荐
很多养猫的小伙伴们都磨刀霍霍准备给猫咪屯些猫冻干吧,特别是家里有挑食猫咪的家庭。有养猫的铲屎官们应该都知道,猫咪是对蛋白质的需求量很高,而且对植物蛋白的吸收效率比较低,所以蛋白质最好都是来自动物的优质蛋白。猫咪挑食就…...

扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批
近期,“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”(简称“签约仪式”)正式举行。合合信息与华为达成鸿蒙合作,旗下扫描全能王将基于HarmonyOS NEXT正式启动鸿蒙原生应用开发。据悉,扫描全能王是鸿蒙在智能扫…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...