【华为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正式启动鸿蒙原生应用开发。据悉,扫描全能王是鸿蒙在智能扫…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
