当前位置: 首页 > news >正文

【华为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. 小张刷题计划

可从三种思路解决此题

  1. 回溯
    排列组合参考:【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即可(单个一组,每天都看答案即可),如果只有一天,也就不用划分,返回总长度-最大值即可

  1. 动态规划

定义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即可

  1. 二分法
    二分模板参考:【华为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

题解

  1. 回溯
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();}}
}
  1. 动态规划
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;}
}
  1. 二分法
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

题目 为了提升软件编码能力&#xff0c;小王制定了刷题计划&#xff0c;他选了题库中的n道题&#xff0c;编号从0到n-1&#xff0c;并计划在m天内按照题目编号顺序刷完所有的题目(注意&#xff0c;小王不能用多天完成同一题) 在小王刷题计划中&#xff0c;小王需要用time[i]的时…...

使用pytorch进行图像预处理的常用方法的详细解释

一般来说&#xff0c;我们在使用pytorch进行图像分类任务时都会对训练集数据做必要的格式转换和增广处理&#xff0c;对测试集做格式处理。 以下是常用的数据集处理函数&#xff1a; data_transform { "train": transforms.Compose([transforms.RandomResizedCro…...

天线根据什么进行分类

天线是信息化时代的一个标准&#xff0c;广播信号塔&#xff0c;通信基站塔&#xff0c;卫星天线还有每天都要用到的手机&#xff0c;都是含有天线的&#xff0c;只是各种天线的作用不同&#xff0c;大小不同。今天给大家说一下&#xff0c;天线是如何分类的。 1.按工作性质可…...

JavaScript:正则表达式

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

【Linux】深挖进程地址空间

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

SVM(支持向量机)-机器学习

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归分析的监督学习算法。它属于机器学习中的一类强大而灵活的模型&#xff0c;广泛应用于模式识别、图像分类、自然语言处理等领域。 基本原理: SVM的基本原理是通过找到能够有效分…...

解决生成的insert语句内有单引号的情况

背景 因为Mybatis-Plus的saveBatch()方法的批量插入其实也是循环插入&#xff0c;而不是真正的一个SqlSession完成的批插&#xff0c;效率很低。所以我们在写批量插入的时候是自己实现了一个工具类去生成批量插入的sql再去执行&#xff0c;但是会遇到有些文本里有单引号导致插…...

【Linux 程序】1. 程序构建

文章目录 【 1. 配置 】【 2. 编译 】makefile编写的要点makefile中的全局自变量CMake编译依赖的库g编译 【 3. 安装 】 一般源代码提供的程序安装需要通过配置、编译、安装三个步骤&#xff1b; 配置。检查当前环境是否满足要安装软件的依赖关系&#xff0c;以及设置程序安装所…...

GLTF 编辑器实现逼真3D动物毛发效果

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 要实现逼真的3D动物毛发效果&#xff0c;可以采用以下技术和方法&…...

【Go语言入门:Go语言的方法,函数,接口】

文章目录 4.Go语言的方法&#xff0c;函数&#xff0c;接口4.1. 方法4.1.1. 指针接受者4.1.2. 值接收者和指针接收者有什么区别&#xff1f;4.1.3. 方法 4.2. 接口4.2.1. 接口定义 4.3. 函数4.3.1. 函数介绍 4.Go语言的方法&#xff0c;函数&#xff0c;接口 4.1. 方法 4.1.1…...

vue-cli3/webpack打包时去掉console.log调试信息

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

企业品牌推广在国外媒体投放的意义和作用何在?

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

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)

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

代码质量评价及设计原则

1.评价代码质量的标准 1.1 可维护性 可维护性强的代码指的是: 在不去破坏原有的代码设计以及不引入新的BUG的前提下,能够快速的修改或者新增代码. 不易维护的代码指的是: 在添加或者修改一些功能逻辑的时候,存在极大的引入新的BUG的风险,并且需要花费的时间也很长. 代码可…...

编程笔记 html5cssjs 012 HTML分块

编程笔记 html5&css&js 012 HTML分块 一、HTML 块级元素二、HTML 内联元素三、HTML <div> 元素四、HTML <span> 元素五、HTML<article>元素六、<article>元素和<div>元素的区别与联系小结 像报纸排版一样&#xff0c;很多时候需要把平面…...

【持续更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】

目录 &#xff08;1&#xff09;项目可行性分析 &#xff08;2&#xff09;需求描述 &#xff08;3&#xff09;界面原型 &#xff08;4&#xff09;数据库设计 &#xff08;5&#xff09;后端工程 接下来我们使用uniappspringboot实现一个简单的前后端分离的小项目----个…...

nginx+rsyslog+kafka+clickhouse+grafana 实现nginx 网关监控

需求 我想做一个类似腾讯云网关日志最终以仪表方式呈现&#xff0c;比如说qps、p99、p95的请求响应时间等等 流程图 数据流转就像标题 nginx ----> rsyslog ----> kafka —> clickhouse —> grafana 部署 kafka kafka 相关部署这里不做赘述&#xff0c;只要创…...

User maven 通过什么命令能查到那个包依赖了slf4j-simple-1.7.36.jar

要在 Maven 项目中查找哪个包依赖了 slf4j-simple-1.7.36.jar&#xff0c;您可以使用 Maven 的依赖树命令 mvn dependency:tree。这个命令会展示项目所有依赖的层次结构&#xff0c;包括传递依赖&#xff08;即一个依赖的依赖&#xff09;。然后&#xff0c;您可以搜索或过滤输…...

什么牌子冻干猫粮性价比高?性价比高的五款冻干猫粮牌子推荐

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

扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批

近期&#xff0c;“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”&#xff08;简称“签约仪式”&#xff09;正式举行。合合信息与华为达成鸿蒙合作&#xff0c;旗下扫描全能王将基于HarmonyOS NEXT正式启动鸿蒙原生应用开发。据悉&#xff0c;扫描全能王是鸿蒙在智能扫…...

性能巨兽:基于AMD EPYC 9755与RTX 5090D的UltraLAB GA660M仿真工作站深度解析

在高端制造、能源勘探和前沿科学计算领域&#xff0c;算力永远是稀缺资源。每一次CPU与GPU的代际更迭&#xff0c;都意味着仿真效率的指数级提升。今天&#xff0c;我们解析的这款UltraLAB GA660M241256-MBD工作站&#xff0c;正是集成了2026年顶级硬件技术的算力平台。它不仅是…...

探索GitHub导航菜单:平台功能、解决方案、资源及GlycemicGPT项目全揭秘

导航菜单包含登录、外观设置等选项&#xff0c;还有平台、解决方案、资源、开源、企业版等板块。平台有AI代码创作&#xff08;如GitHub Copilot、GitHub Spark等&#xff09;、开发者工作流&#xff08;如Actions、Codespaces等&#xff09;、应用程序安全&#xff08;如GitHu…...

Linux内核构建自动化:jpoindexter/kern工具实战指南

1. 项目概述&#xff1a;一个被低估的Linux内核构建工具 如果你和我一样&#xff0c;长期在嵌入式开发、内核模块调试或者需要频繁定制Linux内核的岗位上工作&#xff0c;那么你一定对内核的配置、编译、打包这一套繁琐的流程感到又爱又恨。爱的是&#xff0c;这是深入理解操作…...

AI技能实战:本地部署大模型构建智能摘要工具

1. 项目概述&#xff1a;一个面向AI技能实践的开发者工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫inblog-inc/inblog-ai-skills。光看这个名字&#xff0c;你可能会觉得它又是一个关于“AI技能”的教程合集或者理论文档。但点进去之后&#xff0c;我发现它的定位…...

OpenFold实战指南:在Linux系统部署蛋白质结构预测模型

1. 从仰望到上手&#xff1a;OpenFold如何让蛋白质结构预测走进寻常实验室去年AlphaFold2横空出世&#xff0c;几乎以一己之力解决了困扰生物学界半个世纪的“蛋白质折叠问题”&#xff0c;其意义不亚于在生命科学领域投下了一颗重磅炸弹。一时间&#xff0c;无论是结构生物学家…...

调试效率翻倍:在VSCode里实时查看PY32的RTT日志(JLink OB就行)

嵌入式开发效率革命&#xff1a;VSCode集成JLink RTT日志全攻略 1. 嵌入式开发者的效率痛点与解决方案 在嵌入式开发领域&#xff0c;调试信息的输出一直是影响开发效率的关键环节。传统方式通常需要依赖串口输出&#xff0c;开发者不得不在多个工具间频繁切换——编写代码时使…...

Potrace实战指南:5分钟掌握位图转矢量的开源神器

Potrace实战指南&#xff1a;5分钟掌握位图转矢量的开源神器 【免费下载链接】potrace [mirror] Tool for tracing a bitmap, which means, transforming a bitmap into a smooth, scalable image 项目地址: https://gitcode.com/gh_mirrors/pot/potrace 还在为位图放大…...

从MC1496乘法器到DSB调制:一个经典电路的设计实践与参数解析

1. DSB调制基础与MC1496乘法器简介 第一次接触DSB调制电路时&#xff0c;我被那个看似简单的波形变换背后精妙的数学原理深深吸引。DSB&#xff08;Double Sideband&#xff09;双边带调制&#xff0c;本质上是用低频信号去控制高频载波的幅度&#xff0c;但与传统AM调制不同&a…...

Marathon已过时?迁移到Swift Package Manager的完整步骤

Marathon已过时&#xff1f;迁移到Swift Package Manager的完整步骤 【免费下载链接】Marathon [DEPRECATED] Marathon makes it easy to write, run and manage your Swift scripts &#x1f3c3; 项目地址: https://gitcode.com/gh_mirrors/mar/Marathon Marathon作为…...

处理器与FPGA异构SoM设计:架构、协同与工程实践

1. 项目概述&#xff1a;当“大脑”与“加速器”合二为一最近几年&#xff0c;但凡涉及到边缘计算、工业视觉或者通信基带这些对实时性和算力有双重“压榨”需求的领域&#xff0c;传统的单一架构芯片越来越显得力不从心。CPU&#xff08;中央处理器&#xff09;擅长复杂的逻辑…...