华为OD机试 - 最大连续文件之和(Python/JS/C/C++ 2024 E卷 200分)

news2024/10/5 15:56:59

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2…Fn。

随着时间的推移,所占存储会越来越大。

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

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

二、输入描述

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

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

三、输出描述

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

四、测试用例

1、输入

1000
100 300 500 400 400 150 100

2、输出

950

3、说明

最大序列和为950,序列为[400,400,150]。

五、解题思路

  1. 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和;
  2. 将当前文件大小加到curr上;
  3. 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位;
  4. 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件;
  5. 输出能转储的最大连续文件大小之和ret;

六、Python算法源码

# 导入必要的库
import sys

def main():
    # 读取标准输入的所有行,并去除末尾的换行符
    lines = sys.stdin.read().splitlines()
    
    # 第1行:SATA盘容量M,转换为整数
    M = int(lines[0])
    
    # 第2行:区块链文件大小序列,转换为整数列表
    arr = list(map(int, lines[1].split()))
    
    # 序列arr的长度n
    n = len(arr)
    
    # 连续文件的左边界l,初始为0
    l = 0
    # 连续文件的右边界r,初始为0
    r = 0
    # 当前连续文件大小之和curr,初始为0
    curr = 0
    # 能转储的最大连续文件大小之和ret,初始为0
    ret = 0
    
    # 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while r < n:
        # 将当前文件大小加到curr上
        curr += arr[r]
        
        # 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if curr <= M:
            ret = max(ret, curr)
            r += 1
        else:
            # 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            # 将左指针l指向的文件大小从curr中减去
            curr -= arr[l]
            # 左指针l向右移动一位
            l += 1
    
    # 输出能转储的最大连续文件大小之和ret
    print(ret)

# 调用主函数
if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 定义资源分配函数
function main() {
    const fs = require('fs');
    // 读取所有输入内容,并按行分割
    const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
    
    // 第1行:SATA盘容量M,转换为整数
    const M = parseInt(input[0]);
    
    // 第2行:区块链文件大小序列,转换为整数数组
    const arr = input[1].split(' ').map(Number);
    
    // 序列arr的长度n
    const n = arr.length;
    
    // 连续文件的左边界l,初始为0
    let l = 0;
    // 连续文件的右边界r,初始为0
    let r = 0;
    // 当前连续文件大小之和curr,初始为0
    let curr = 0;
    // 能转储的最大连续文件大小之和ret,初始为0
    let ret = 0;
    
    // 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while (r < n) {
        // 将当前文件大小加到curr上
        curr += arr[r];
        
        // 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if (curr <= M) {
            ret = Math.max(ret, curr);
            r += 1;
        } else {
            // 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            // 将左指针l指向的文件大小从curr中减去
            curr -= arr[l];
            // 左指针l向右移动一位
            l += 1;
        }
    }
    
    // 输出能转储的最大连续文件大小之和ret
    console.log(ret);
}

// 调用主函数
main();

八、C算法源码

#include <stdio.h>

// 主函数
int main() {
    int M; // 定义SATA盘容量M
    // 读取SATA盘容量M
    scanf("%d", &M);
    
    // 定义文件大小数组,最大可能为100000个文件
    int arr[100000];
    int n = 0; // 文件数量初始化为0
    
    // 读取区块链文件大小序列,直到换行或文件结束
    while (scanf("%d", &arr[n]) != EOF) {
        n++;
        // 防止数组越界
        if (n >= 100000) {
            break;
        }
    }
    
    int l = 0; // 连续文件的左边界l,初始为0
    int r = 0; // 连续文件的右边界r,初始为0
    long long curr = 0; // 当前连续文件大小之和curr,使用long long防止溢出
    long long ret = 0; // 能转储的最大连续文件大小之和ret,使用long long
    
    // 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while (r < n) {
        // 将当前文件大小加到curr上
        curr += arr[r];
        
        // 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if (curr <= M) {
            if (curr > ret) {
                ret = curr;
            }
            r++;
        } else {
            // 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            // 将左指针l指向的文件大小从curr中减去
            curr -= arr[l];
            // 左指针l向右移动一位
            l++;
        }
    }
    
    // 输出能转储的最大连续文件大小之和ret
    printf("%lld\n", ret);
    
    return 0; // 程序结束
}

九、C++算法源码

#include <iostream>
#include <vector>
using namespace std;

// 主函数
int main(){
    ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率
    cin.tie(0); // 取消cin和cout的绑定
    
    long long M; // 定义SATA盘容量M,使用long long防止溢出
    cin >> M; // 读取SATA盘容量M
    
    vector<int> arr; // 定义文件大小数组
    int num;
    // 读取区块链文件大小序列,直到换行或文件结束
    while(cin >> num){
        arr.push_back(num);
    }
    
    int n = arr.size(); // 文件数量
    int l = 0; // 连续文件的左边界l,初始为0
    int r = 0; // 连续文件的右边界r,初始为0
    long long curr = 0; // 当前连续文件大小之和curr
    long long ret = 0; // 能转储的最大连续文件大小之和ret
    
    // 使用双指针法遍历文件序列arr,通过移动指针来找到能转储的最大连续文件大小之和
    while (r < n) {
        // 将当前文件大小加到curr上
        curr += arr[r];
        
        // 如果curr小于等于M,更新ret为curr和ret中的较大值,右指针r向右移动一位
        if (curr <= M) {
            if (curr > ret) {
                ret = curr;
            }
            r++;
        } else {
            // 如果curr大于M,说明当前连续文件大小之和超过了SATA盘容量,需要调整边界来找到新的连续文件
            // 将左指针l指向的文件大小从curr中减去
            curr -= arr[l];
            // 左指针l向右移动一位
            l++;
        }
    }
    
    // 输出能转储的最大连续文件大小之和ret
    cout << ret << "\n";
    
    return 0; // 程序结束
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

1.资源《Arduino UNO R3 proteus 仿真工程》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 仿真工程 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;proteus工程、原理图、仿真程序。 3.内容展示 4.简述 该文件为proteus工程&#xff0c;用于Arduino uno r3仿真。 因为软件自动运行&#xff0c;所以最小…

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

c++结构体嵌套

没有很听懂这个课 有点乱了、 // // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std; int main() {struct Point{ //定义一个叫做point的结构体double x, y;};struct Radius{Point pt; //嵌套point结构体在radius结构体里面 把他名字定…

网络威胁情报技术的进步

网络威胁形势不断演变&#xff0c;必然导致防御者和攻击者之间持续展开军备竞赛。幸运的是&#xff0c;网络威胁情报 (CTI) 技术的进步为安全专业人员提供了强大的工具&#xff0c;使他们能够保持领先地位。 本指南深入探讨了 CTI 的最新进展&#xff0c;让您了解这些技术如何…

设计模式之桥接模式(Bridge)

一、桥接模式介绍 桥接模式(bridge pattern) 的定义是&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立 地变化。 桥接模式用一种巧妙的方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c; 将类之间的静态继承关系转变为…

【CKA】十四、监控pod的日志

14、监控pod的日志 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 查看名字是foobar的pod的日志&#xff0c;过滤出 unable-to-access-website&#xff0c;导入到文件中就可以&#xff0c;这道题还是挺简单的 3. 官网地址&#xff1a; https://kubernetes.io/zh-cn/doc…

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

警惕!脑出血前这8大预警信号,你不可不知!

在这个快节奏的时代&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;突如其来的疾病往往让人措手不及&#xff0c;尤其是像脑出血这样的严重疾病&#xff0c;其发病急、进展快&#xff0c;若不及时识别并就医&#xff0c;后果不堪设想。今天&#xff0c;我们就来…

在登陆功能中添加Redis缓存

目录 基于Redis实现短信登录 实现流程图 实现代码 解决登录状态刷新问题 初始方案思路&#xff1a; 实现代码 发送验证码 登陆实现 如果是新用户则自动创建 运行测试 基于Redis实现短信登录 实现流程图 实现代码 Overridepublic Result login(LoginFormDTO loginForm…

影刀RPA:Excel内容填充指令

1.实战目标 本次主要介绍影刀RPA如何操作内容相关的填充与替换指令。主要包含以下 这些指令在数据处理方面有着重要的作用&#xff0c;可以对数据做运算&#xff0c;填充&#xff0c;替换&#xff0c;实现数据格式统一&#xff0c;便于最终的数据分析。在操作的过程中&#xf…

WordPress修改固定链接后301的重定向方法

网站改版实际上是很忌讳的&#xff0c;尤其是针对已被搜索引擎收录的网站&#xff0c;新站不用考虑这些问题&#xff0c;而已经收录的网站网页在不遵守搜索引擎规则的前提下&#xff0c;是会被降权&#xff0c;关键词排名下滑、流量IP会被剥夺、收录会减少 、业务成交量会急剧下…

(Linux驱动学习 - 6).Linux中断

一. Linux 中断 API 函数 1.中断号 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断&#xff0c;有的资料也把中断号叫做中 断线。在 Linux 内核中使用一个 int 变量表示中断号。 2.申请中断 - request_irq 函数原型&#xff1a; int request_irq(unsigne…

【ubuntu】APT、apt、apt-get介绍

目录 1.APT简介 2.常用apt指令 2.1安装 2.2更新列表 2.3更新已经安装的软件包 2.4搜索软件包 2.5显示软件包信息 2.6移除软件包 2.7清理无用的安装包 2.8清理无用的依赖项 3.apt和apt-get 3.1区别 3.2 总结 1.APT简介 APT的全称是advanced package …

Java反射、自定义注解Demo

本文主要尝试使用反射、自定义注解&#xff0c;实现简单的Demo&#xff0c;所有代码均可直接复制使用。&#xff08;反射和注解是Java框架不可或缺的一部分&#xff0c;我们应该熟练掌握这部分知识&#xff01;&#xff09; 本文的代码结构如下&#xff1a; 代码如下&#xff…

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源&#xff08;针对于虚拟机用户&#xff09; 3. vim编辑器3.1 vim是什么&#xff1f;3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…

高级图片编辑器Photopea

什么是 Photopea &#xff1f; Photopea 是一款免费的在线工具&#xff0c;用于编辑光栅和矢量图形&#xff0c;支持PSD、AI 和 Sketch文件。 功能上&#xff0c;Photopea 和 老苏之前介绍的 miniPaint 比较像 文章传送门&#xff1a;在线图片编辑器miniPaint 支持的格式 复杂…

创建django项目,编译类型选择Custom environment后,却没有manage.py文件,无法启动项目?

选择 Custom environment 创建后&#xff0c;启动项目却发现没有manage.py文件 解决办法&#xff1a; 1、 首先查看项目中是否安装了django&#xff0c;没有则安装 2 、创建项目&#xff08;这里的myproject则表示项目名&#xff09; django-admin startproject myproject …

C语言 | Leetcode C语言题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…

外包功能测试干了4年,技术退步太明显了。。。。。​

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

Day01-postgresql数据库基础入门培训

Day01-postgresql数据库基础入门培训 1、PostgresQL数据库简介2、PostgreSQL行业生态应用3、PostgreSQL版本发展与特性4、PostgreSQL体系结构介绍5、PostgreSQL与MySQL的区别6、PostgreSQL与Oracle、MySQL的对比 1、PostgresQL数据库简介 PostgreSQL【简称&#xff1a;PG】是加…