news 2026/4/24 21:42:56

(新卷,200分)- 区块链文件转储系统(Java JS Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,200分)- 区块链文件转储系统(Java JS Python)

(新卷,200分)- 区块链文件转储系统(Java & JS & Python)

题目描述

区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2,...,Fn。随着时间的推移,所占存储会越来越大。

云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。

假设每块SATA盘容量为M,求能转储的最大连续文件之和。

输入描述

第一行为SATA盘容量M,1000 ≤ M ≤ 1000000

第二行为区块链文件大小序列F1,F2,...,Fn。其中 1 ≤ n ≤ 100000,1 ≤ Fi ≤ 500

输出描述

求能转储的最大连续文件大小之和

用例
输入1000
100 300 500 400 400 150 100
输出950
说明最大序列和为950,序列为[400,400,150]
输入1000
100 500 400 150 500 100
输出1000
说明最大序列和为1000,序列为[100,500,400]
题目解析

由于本题需要求解最大连续文件大小之和,因此可以考虑使用双指针+滑动窗口来解题。

本题的滑动窗口的左边界l,右边界r的运动逻辑如下:

  • 如果滑动窗口内部和 < m,则r++
  • 如果滑动窗口内部和 > m,则l++
  • 如果滑动窗口内部和 = m,则已得到最大值,直接返回m即可。

在计算滑动窗口内部和的过程中,如果r++,则说明内部和可能会增大产生最大值,因此我们需要在r++时,判断并保留最大值。

JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 2) { const m = lines[0] - 0; const F = lines[1].split(" ").map(Number); console.log(getResult(m, F)); lines.length = 0; } }); function getResult(m, F) { let l = 0, r = 0; let n = F.length; let sum = 0; let max = 0; while (r < n) { // 尝试右指针右移一下的新和(注意初始时右指针右移后指向0) const newSum = sum + F[r]; // 如果新和超过了m,即SATA盘容量,则右指针不能右移,并且还需要左指针右移来减少旧和 if (newSum > m) { sum -= F[l++]; // 左指针右移只会减少旧和,因此不会产生最大值 } // 如果新和小于m,则当前尝试的右指针右移可行,因此 sum += F[r],并且我们下一步还可以继续尝试让右指针右移,即r++ else if (newSum < m) { sum += F[r++]; max = Math.max(sum, max); // 右指针右移时会增加旧和,因此可能会产生最大值 } // 如果新和等于m,那么说明已经找到了一个容量和SATA盘相同的连续文件大小,即此时已经是最大值了,可以直接返回 else { return m; } } return max; }
Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = Integer.parseInt(sc.nextLine()); Integer[] f = Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new); System.out.println(getResult(m, f)); } public static int getResult(int m, Integer[] f) { int l = 0, r = 0; int sum = 0, max = 0; int n = f.length; while (r < n) { // 尝试右指针右移一下的新和(注意初始时右指针右移后指向0) int newSum = sum + f[r]; // 如果新和超过了m,即SATA盘容量,则右指针不能右移,并且还需要左指针右移来减少旧和 if (newSum > m) { sum -= f[l++]; // 左指针右移只会减少旧和,因此不会产生最大值 } // 如果新和小于m,则当前尝试的右指针右移可行,因此 sum += F[r],并且我们下一步还可以继续尝试让右指针右移,即r++ else if (newSum < m) { sum += f[r++]; max = Math.max(sum, max); // 右指针右移时会增加旧和,因此可能会产生最大值 } // 如果新和等于m,那么说明已经找到了一个容量和SATA盘相同的连续文件大小,即此时已经是最大值了,可以直接返回 else { return m; } } return max; } }
Python算法源码
m = int(input()) f = list(map(int, input().split())) def getResult(m, f): l = 0 r = 0 n = len(f) sum = 0 maxV = 0 while r < n: # 尝试右指针右移一下的新和(注意初始时右指针右移后指向0) newSum = sum + f[r] # 如果新和超过了m,即SATA盘容量,则右指针不能右移,并且还需要左指针右移来减少旧和 if newSum > m: # 左指针右移只会减少旧和,因此不会产生最大值 sum -= f[l] l += 1 # 如果新和小于m,则当前尝试的右指针右移可行,因此 sum += F[r],并且我们下一步还可以继续尝试让右指针右移,即r++ elif newSum < m: sum += f[r] r += 1 maxV = max(sum, maxV) # 右指针右移时会增加旧和,因此可能会产生最大值 # 如果新和等于m,那么说明已经找到了一个容量和SATA盘相同的连续文件大小,即此时已经是最大值了,可以直接返回 else: return m return maxV print(getResult(m, f))
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 9:40:07

制造业七大核心系统盘点——ERP、MES、WMS、SCM、PLM、SCADA、QMS

我这几年跑工厂、聊老板、跟信息化负责人沟通&#xff0c;听到最多的一句话不是我们没系统&#xff0c;而是&#xff1a;ERP 上了&#xff0c;车间还是一团乱MES 买了&#xff0c;数据没人信仓库有系统&#xff0c;库存还是对不上系统一堆&#xff0c;但问题一个没少这时候很多…

作者头像 李华
网站建设 2026/4/21 15:42:00

前端使用docker打包nuxt官网项目

安装docker的文章在另一篇&#xff1a;https://blog.csdn.net/m0_69727853/article/details/154741168?spm1001.2014.3001.5501 1. 查看docker是否安装成功 docker -v 2. 如果显示没有docker&#xff0c;查看当前的环境变量是否正确 tips提示&#xff1a;如果找不到安装的doc…

作者头像 李华
网站建设 2026/4/24 0:05:27

Java计算机毕设之基于Java+springboot的寿险公司人力资源管理系统基于SpringBoot的人力资源管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 10:38:47

PolarDB-X 企业版分布式集群部署文档

目录PolarDB-X 企业版分布式集群部署文档快速连接快速连接命令集群信息集群状态Pod 列表服务列表镜像版本安装步骤1. 安装 Helm2. 创建命名空间3. 添加 Helm 仓库并安装 Operator4. 获取最新镜像版本5. 创建集群配置文件6. 部署集群7. 监控部署进度8. 获取连接密码集群架构架构…

作者头像 李华
网站建设 2026/4/19 0:25:57

计算机Java毕设实战-基于springboot的社区协作与资源共享系统社区闲置资源交易与共享系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华