【华为OD题库-035】数据最节约的备份方法-java

题目

有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB.求使用光盘最少的文件分布方式。所有文件的大小都是整数MB,且不超过500MB:文件不能分割、分卷打包
输入描述:
一组文件大小的数据
输出描述:
使用光盘的数量
补充说明:
不用考虑输入数据不合法的情况:假设最多100个输入文件。
示例1
输入:
100,500,300,200,400
输出:
3
说明:
(100,400),(200,300),(500) 3张光盘即可,输入和输出内容都不含空格。
示例2
输入:
100,100,200,300
输出:
2

思路

以500 400 300 80 70 70 50 30为例(已将nums倒序排列),
备份第一个文件500,需要第一个光盘
备份第二个文件400,需要第二个光盘,还剩100空间
备份第三个文件300,上次只剩100空间,所以得另开第三个光盘,备份后还剩200空间
备份第四个文件80,此时第二和第三个光盘的剩余空间都能放下?到底该放入哪一个呢?

  1. 假设放入剩余空间较小的那一个
    备份第四个文件80,放入第二个光盘,此时剩余空间:20
    备份第五个文件70,放入第三个光盘,剩余空间:130
    备份第六个文件70,放入第三个光盘,剩余空间:60
    备份第七个文件50,放入第三个光盘,剩余空间:10
    备份第八个文件30,第二个光盘剩余了20的空间,第三个光盘剩余了10空间,均放不下,所以另起第四个光盘。
    在此分支得到答案为:4
  2. 假设放入剩余空间较大的那一个
    备份第四个文件80,放入第三个光盘,此时剩余空间:120
    备份第五个文件70,放入第三个光盘,剩余空间:60
    备份第六个文件70,放入第二个光盘,剩余空间:30
    备份第七个文件50,放入第三个光盘,剩余空间:10
    备份第八个文件30,放入第二个光盘,剩余空间:0
    在此分支得到答案为:3

很明显,从此用例的结果来看,放入剩余空间较大的那一个,可以更节省光盘。
从逻辑上来分析,当两个空间都能放下当前文件时,放入更大的空间能够保证放入后,两个最小剩余空间更大。比如上面的案例中,当前文件为80,两个光盘的剩余空间分别为100和200,如果放入100,那么两个剩余空间变为:20和200,最小值为20;如果放入200,那么两个剩余空间为100,120,最小值为100;此时再备份新的文件时,如果其大小超过了20,就只能备份到200的空间去,那么第一种方案那20的剩余空间就要被浪费掉了。

因此,最小剩余空间越大,才最省空间。
综上,在代码实现时,应该用一种结构保证始终能找到剩余空间较大的那一个,而剩余空间=500-已使用空间。要想剩余空间最大,就是使用空间最小,可以考虑用最小堆来实现。

  1. 如果堆为空,或者当前值nums[i]+最大剩余空间>500,说明得另开一个光盘,将nums[i]放入最小堆,此时堆大小+1,代表新开了光盘
  2. 如果nums[i]+最大剩余空间<=500,当前文件可以拷贝到上一个光盘,那么直接把上一个光盘取出来,加上当前文件大小,再存回堆中,这样堆的size并没有变化,也就是没有新开光盘
  3. 最后返回堆的大小就代表最少光盘数量。

题解

package hwod;import java.util.*;public class DataCopy {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();System.out.println(dataCopy(nums));}private static int dataCopy(int[] nums) {Arrays.sort(nums);PriorityQueue<Integer> queue = new PriorityQueue<>();for (int i = nums.length-1; i >=0; i--) {if (queue.isEmpty() || nums[i] + queue.peek() > 500) {queue.offer(nums[i]);} else {queue.offer(queue.poll() + nums[i]);}}return queue.size();}}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

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

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

相关文章

如何通过类似于Android adb install apk 命令安装三方Harmony Hap包

安装命令 hdc install xxx.hapOpenHarmony设备安装Hap应用的五种方式 https://www.51cto.com/article/762223.htmlhttps://www.51cto.com/article/762223.html DevEco Studio 3.1为例新建个项目&#xff0c;点击File->Project Structure 进入签名页面然后点击Sign in登录华…

Adobe 家族系列download

adobe 前言 Adobe公司的产品线中拥有多个家族桶&#xff0c;下面是Adobe全家桶产品的功能介绍&#xff1a; Creative Cloud&#xff08;创意云&#xff09;&#xff1a;包含Photoshop、Illustrator、InDesign、Premiere Pro、After Effects、Lightroom等创意设计、视频制作和…

计算机体系结构习题及解答

Exercise For the 5-stage pipeline (RR and RW take half a cycle) For the following pairs of instructions, how many stalls will the 2nd instruction experience (with and without bypassing)? 1. ADD R3 ⬅R1R2 ADD R5 ⬅ R3R4 Answer&#xff1a;0 stall wi…

java springboot测试类鉴定虚拟MVC请求 返回内容与预期值是否相同

上文 java springboot测试类鉴定虚拟MVC运行值与预期值是否相同 中 我们验证了它HTTP的返回状态 简单说 校验了他 是否成功的状态 这次 我们来不对得到的内容 我们 直接改写测试类代码如下 package com.example.webdom;import org.junit.jupiter.api.Test; import org.springf…

【实验笔记】C语言实验——超长正整数的减法运算

[问题描述] 编写程序实现两个超长正整数(每个最长80位数字)的减法运算。 [输入形式] 从键盘读入两个整数&#xff0c;要考虑输入高位可能为0的情况(如00083) 1.第一行是超长正整数A; 2.第二行是超长正整数B; [输出形式] 输出只有一行&#xff0c;是长整数A减去长整数B的运…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-3:任务切换)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

使用 css 实现文字单行居右, 换行居左展示

给外层盒子设置居右展示, 子盒子设置居左。 原理是&#xff0c;如果子盒子没有换行&#xff0c;那么子盒子的长度就是内容的长度&#xff0c;它根本没有空间将字体移动居左&#xff0c;父盒子的居左样式就会生效&#xff0c;子盒子就会居左展示。 当子盒子里面的文字换行了&…

3.1 Linux时间子系统

目录 一时间子系统作用二 时间子系统初始化三 时间子系统框架 一时间子系统作用 1 提供时间 2 提供时钟 3 提供进程轮询 从应用层&#xff0c;分析其使用方法 从驱动层&#xff0c;给出timer和hrtimer的使用示例 二 时间子系统初始化 分别从介绍各个模块初始化做了些什么工作…

在SOLIDWORKS中如何提升保存PDF版本文件的清晰度

随着Solidworks年复一年的不断更新&#xff0c;不仅仅是整个软件的性能上的提升&#xff0c;其在输出文件的功能上也同样在精益求精。 但对于老版本的使用者和希望能让输出文件清晰度更进一步的使用者而言&#xff0c;可能目前我们所能达到的普通文件输出清晰度远远无法达到他们…

如何将ONLYOFFICE与Python应用程序集成

ONLYOFFICE是一项功能强大的开源文档编辑器&#xff0c;可以将文本文档、电子表格和演示文稿、电子表单编辑功能集成至任何编程语言编写的 Web 应用程序中。最新的7.5版本编辑器可以支持编辑PDF文件&#xff08;批注、绘图等&#xff09;。在本文中&#xff0c;我们会带你了解如…

【分享】Java Builder 建造者模式之案例分享

介绍 建造者模式&#xff08;Builder&#xff09;核心目的是通过使用多个简单对象一步步构建出一个复杂对象。通过将复杂对象的构造过程拆分为多个简单的步骤&#xff0c;使得创建对象更加灵活&#xff0c;可读性和可维护性更强。 使用场景 创建一个由多个部分组成的复杂对象…

这样写Allure生成测试报告,学会直接涨薪5k

Allure是一个开源的测试报告生成框架&#xff0c;提供了测试报告定制化功能&#xff0c;相较于我们之前使用过pytest-html插件生成的html格式的测试报告&#xff0c;通过Allure生成的报告更加规范、清晰、美观。 pytest框架支持使用Allure生成测试报告&#xff0c;接下来让介绍…

SpringBoot整合knife4j生成Api文档

一、介绍 先看效果 ①&#xff1a;Swagger 介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的文档…

Doris-集群部署(四)

创建目录并拷贝编译后的文件 1&#xff09;创建目录并拷贝编译后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02&#xff09;修改可打开文件数&#xff08;每个节点&#x…

oracle数据库巡检常见脚本-系列三

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

TIDB基础

TIDB整个逻辑架构跟MYSQL类似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相当于MYSQL的数据库服务器&#xff0c;区别是MYSQL数据库服务器为单进程的&#xff0c;TIDB集群为分布式多进程的。 数据库&#xff1a;同MYSQL数据库&#xff0c;数据库属于集群&#xff0c;…

VM CentOS7安装ffmpeg

项目中涉及给视频添加水印&#xff0c;使用到了ffmpeg&#xff0c;windows系统可直接使用&#xff0c;Linux需要手动编译完成ffmpeg后才可正常使用。 配置yum源: 备份原repo文件 cd /etc/yum.repos.d/mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.r…

编写自己的CA和TA与逆向

参考内容《手机安全和可信应用开发》 https://note.youdao.com/s/MTlG4c1w 介绍 TA的全称是Trust Application&#xff0c; 即可信任应用程序。 CA的全称是Client Applicant&#xff0c; 即客户端应用程序。 TA运行在OP-TEE的用户空间&#xff0c; CA运行在REE侧。 CA执行时代…