华为OD机试 - 芯片资源占用(Python/JS/C/C++ 2024 E卷 200分)

news2024/12/29 13:49:46

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

某块业务芯片最小容量单位为 1.25G,总容量为 M*1.25G,对该芯片资源编号为 1,2,… M。

该芯片支持 3 种不同的配置,分别为 A、B、C.

  • 配置 A: 占用容量为 1.25 * 1 = 1.25G
  • 配置 B: 占用容量为 1.25* 2 = 2.5G
  • 配置 C: 占用容量为 1.258 = 10G

某块板卡上集成了 N 块上述芯片,对芯片编号为 1,2,…,N,各个芯片之间彼此独立,不能跨芯片占用资源.给定板卡上芯片数量 N、每块芯片容量 M、用户按次序配置后,请输出芯片资源占用情况,保证消耗的芯片数量最少。

资源分配规则: 按照芯片编号从小到大分配所需资源,芯片上资源如果被占用标记为 1,没有被占用标记为 0 用户配置序列:用户配置是按次序依次配置到芯片中,如果用户配置序列种某个配置超过了芯片总容量,丢弃该配置,继续遍历用户后续配置。

二、输入描述

  • M:每块芯片容量为 M*1.25G,取值范围为: 1~256
  • N:每块板卡包含芯片数量,取值范围为 1~32
  • 用户配置序列:例如 ACABA,长度不超过 1000

三、输出描述

板卡上每块芯片的占用情况。

备注:

用户配置是按次序依次配置到芯片中,如果用户配置序列种某个配置超过了芯片总容量,丢弃该配置,继续遍历用户后续配置。

四、题目解析

本题输出比较难以理解,我这里以用例 1 解释一下:

1、输入

8
2
ACABA

2、输出

11111000
11111111

用例 1 的前两行输入表示:

板卡上有 N=2 个芯片,而每个芯片有 8 个单位容量,因此对应如下:

00000000
00000000

其中每个 0 代表一个单位容量,而一个芯片有 8 单位容量,因此第一排 8 个 0 代表一个芯片的总容量,第二排 8 个 0 代表另一个芯片的总容量理解了这个,本题就不难了。

四、解题思路

  1. 首先读取输入的芯片容量 M、芯片数量 N 和用户配置序列;
  2. 创建一个长度为 N 的数组 boardCard,用于表示每块芯片的剩余容量;初始时,每块芯片的剩余容量为 M * 1.25;
  3. 创建一个哈希表 dict,用于存储配置与占用容量的对应关系;其中,‘A’ 对应占用容量为 1.25,‘B’ 对应占用容量为 2.5,‘C’ 对应占用容量为 10;
  4. 遍历用户配置序列,对于每个配置,执行以下操作:
    • 计算当前配置对应的占用容量 need;
    • 遍历芯片数组 boardCard,找到第一个剩余容量大于等于 need 的芯片,并将其剩余容量减去 need;
    • 如果没有找到满足条件的芯片,则丢弃该配置;
  5. 遍历芯片数组 boardCard,对于每块芯片,输出占用情况;将剩余容量转换为对应的占用情况字符串,其中 1 表示占用,0 表示未占用;
  6. 输出每块芯片的占用情况;

五、Python算法源码

# 导入必要的库
import sys

def allocate_resources(M, N, config_sequence):
    # 定义每种配置占用的容量(单位为1.25G)
    config_size = {
        'A': 1,  # A配置占用1.25G
        'B': 2,  # B配置占用2.5G
        'C': 8   # C配置占用10G
    }
    
    # 初始化每个芯片的剩余容量,初始为M
    remaining = [M for _ in range(N)]
    
    # 初始化每个芯片的资源占用情况,使用二进制字符串表示
    allocation = ['0' * M for _ in range(N)]
    
    # 遍历每一个配置
    for config in config_sequence:
        size = config_size.get(config, 0)  # 获取配置的大小
        allocated = False  # 标记是否成功分配
        # 尝试将配置分配到最小编号的芯片
        for i in range(N):
            if remaining[i] >= size:
                # 更新剩余容量
                remaining[i] -= size
                # 更新资源占用情况
                allocation[i] = '1' * size + allocation[i][size:]
                allocated = True
                break  # 成功分配后退出循环
        if not allocated:
            # 如果所有芯片都无法分配,丢弃该配置
            continue
    
    # 打印每个芯片的资源占用情况
    for chip_allocation in allocation:
        print(chip_allocation)

# 主函数,处理输入输出
if __name__ == "__main__":
    # 读取每块芯片的容量M
    M = int(sys.stdin.readline())
    # 读取芯片数量N
    N = int(sys.stdin.readline())
    # 读取用户配置序列
    config_sequence = sys.stdin.readline().strip()
    # 调用资源分配函数
    allocate_resources(M, N, config_sequence)

六、JavaScript算法源码

// 定义资源分配函数
function allocateResources(M, N, configSequence) {
    // 定义每种配置占用的容量(单位为1.25G)
    const configSize = {
        'A': 1,  // A配置占用1.25G
        'B': 2,  // B配置占用2.5G
        'C': 8   // C配置占用10G
    };

    // 初始化每个芯片的剩余容量,初始为M
    let remaining = Array(N).fill(M);

    // 初始化每个芯片的资源占用情况,使用二进制字符串表示
    let allocation = Array(N).fill('0'.repeat(M));

    // 遍历每一个配置
    for (let config of configSequence) {
        let size = configSize[config] || 0;  // 获取配置的大小
        let allocated = false;  // 标记是否成功分配
        // 尝试将配置分配到最小编号的芯片
        for (let i = 0; i < N; i++) {
            if (remaining[i] >= size) {
                // 更新剩余容量
                remaining[i] -= size;
                // 更新资源占用情况
                allocation[i] = '1'.repeat(size) + allocation[i].substring(size);
                allocated = true;
                break;  // 成功分配后退出循环
            }
        }
        if (!allocated) {
            // 如果所有芯片都无法分配,丢弃该配置
            continue;
        }
    }

    // 打印每个芯片的资源占用情况
    for (let chipAllocation of allocation) {
        console.log(chipAllocation);
    }
}

// 示例用法,读取输入并调用函数
const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];
rl.on('line', function(line){
    input.push(line);
}).on('close', function(){
    const M = parseInt(input[0]);
    const N = parseInt(input[1]);
    const configSequence = input[2].trim();
    allocateResources(M, N, configSequence);
    process.exit(0);
});

七、C算法源码

#include <stdio.h>
#include <string.h>

// 定义最大芯片数量和配置序列长度
#define MAX_N 32
#define MAX_SEQUENCE 1000

int main() {
    int M, N;
    char config_sequence[MAX_SEQUENCE + 1];
    
    // 读取每块芯片的容量M
    scanf("%d", &M);
    // 读取芯片数量N
    scanf("%d", &N);
    // 读取用户配置序列
    scanf("%s", config_sequence);
    
    // 定义每种配置占用的容量(单位为1.25G)
    int config_size[256] = {0};  // 初始化为0
    config_size['A'] = 1;  // A配置占用1.25G
    config_size['B'] = 2;  // B配置占用2.5G
    config_size['C'] = 8;  // C配置占用10G
    
    // 初始化每个芯片的剩余容量,初始为M
    int remaining[MAX_N];
    for(int i = 0; i < N; i++) {
        remaining[i] = M;
    }
    
    // 初始化每个芯片的资源占用情况,使用字符数组表示
    char allocation[MAX_N][MAX_SEQUENCE + 1];
    for(int i = 0; i < N; i++) {
        memset(allocation[i], '0', M);
        allocation[i][M] = '\0';  // 添加字符串结束符
    }
    
    // 遍历每一个配置
    int len = strlen(config_sequence);
    for(int i = 0; i < len; i++) {
        char config = config_sequence[i];
        int size = config_size[(int)config];  // 获取配置的大小
        int allocated = 0;  // 标记是否成功分配
        // 尝试将配置分配到最小编号的芯片
        for(int j = 0; j < N; j++) {
            if(remaining[j] >= size) {
                // 更新剩余容量
                remaining[j] -= size;
                // 更新资源占用情况
                for(int k = 0; k < size; k++) {
                    if(k < M) {
                        allocation[j][k] = '1';
                    }
                }
                allocated = 1;
                break;  // 成功分配后退出循环
            }
        }
        if(!allocated){
            // 如果所有芯片都无法分配,丢弃该配置
            continue;
        }
    }
    
    // 打印每个芯片的资源占用情况
    for(int i = 0; i < N; i++) {
        printf("%s\n", allocation[i]);
    }
    
    return 0;
}

八、C++算法源码

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
    int M, N;
    string config_sequence;
    
    // 读取每块芯片的容量M
    cin >> M;
    // 读取芯片数量N
    cin >> N;
    // 读取用户配置序列
    cin >> config_sequence;
    
    // 定义每种配置占用的容量(单位为1.25G)
    int config_size[256] = {0};  // 初始化为0
    config_size['A'] = 1;  // A配置占用1.25G
    config_size['B'] = 2;  // B配置占用2.5G
    config_size['C'] = 8;  // C配置占用10G
    
    // 初始化每个芯片的剩余容量,初始为M
    vector<int> remaining(N, M);
    
    // 初始化每个芯片的资源占用情况,使用字符串表示
    vector<string> allocation(N, string(M, '0'));
    
    // 遍历每一个配置
    for(char config : config_sequence){
        int size = config_size[(int)config];  // 获取配置的大小
        bool allocated = false;  // 标记是否成功分配
        // 尝试将配置分配到最小编号的芯片
        for(int i = 0; i < N; i++){
            if(remaining[i] >= size){
                // 更新剩余容量
                remaining[i] -= size;
                // 更新资源占用情况
                for(int j = 0; j < size && j < M; j++){
                    allocation[i][j] = '1';
                }
                allocated = true;
                break;  // 成功分配后退出循环
            }
        }
        if(!allocated){
            // 如果所有芯片都无法分配,丢弃该配置
            continue;
        }
    }
    
    // 打印每个芯片的资源占用情况
    for(auto &chip_allocation : allocation){
        cout << chip_allocation << endl;
    }
    
    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/2203189.html

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

相关文章

Linux_进程概念详解

本篇文章为作者学习Linux时所作总结&#xff0c;可能会有总结不足或疏漏之处&#xff0c;如有发现请各路大神批评指正 什么是进程&#xff1f; 课本上说&#xff0c;进程是程序的一个执行实例&#xff0c;正在执行的程序。对&#xff0c;也不对&#xff0c;我称之为正确的废话…

嵌入式面试——FreeRTOS篇(七) 软件定时器

本篇为&#xff1a;FreeRTOS 软件定时器篇 一、软件定时器的简介 1、定时器介绍 答&#xff1a; 定时器&#xff1a;从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户可以自定义定时器周期。 硬件定时器&#xff1a;芯片本…

python项目实战-xPath下载人生格言

事先声明一下&#xff0c;仅分享爬虫经验&#xff0c;不会对网站有影响的&#xff0c;也请想要实操的小伙伴不要对网站频繁访问&#xff0c;如有侵权请联系我删除文章 文章目录 代码展示步骤解析思路整理节点树xPath语法分析网页结构 实战思路获取源代码源代码转化成节点树提取…

新手必备!百度思维导图在内四款必备工具分享

作为一名资料员&#xff0c;每天都要处理大量的信息和数据&#xff0c;思维导图对我来说简直就是救星。它帮我理清思路&#xff0c;把复杂的信息条理化&#xff0c;让我能更高效地完成工作。今天&#xff0c;我就来跟大家分享一下我用过的几款思维导图工具&#xff1a;福昕思维…

java项目之基于保密信息学科平台系统源码(springboot+vue+mysql)

项目简介 基于保密信息学科平台系统实现了以下功能&#xff1a; 基于保密信息学科平台系统的主要使用者管理员有个人中心&#xff0c;用户管理&#xff0c;教师管理&#xff0c;学科概况管理&#xff0c;人才培养管理&#xff0c;学科动态管理&#xff0c;学科资源管理&#…

2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》

随着大模型技术的不断完善和普及&#xff0c;我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效&#xff0c;并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一&#xff0c;以GPT为代表的大模型应用一经推出在短…

信息系统与计算技术国际学术会议

第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;将于2024年11月8日-11月11日在中国西安盛大举行&#xff0c;由长沙理工大学主办&#xff0c;同济大学、西北工业大学联合协办。 会议聚焦信息系统与计算技术等相关研究领域&#xff0c;广泛邀请国内外…

JavaGuide(3)

一、项目背景与简介 JavaGuide由GitHub用户Snailclimb开发并维护&#xff0c;是一个全面而深入的Java学习资源库。它旨在为Java初学者和有经验的开发者提供一个系统的学习路径和丰富的资源&#xff0c;帮助他们系统地学习和巩固Java及相关技术知识。 二、项目内容与特点 Jav…

【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因&#xff1f; 首先我们要知道的是&#xff0c;浏览器在解析 HTML 的过程中&#xff0c;遇到了 script 元素是不能继续构建 DOM 树的。 它会停止解析构建&#xff0c;首先去下载 js 代码&#xff0c;并且执行 js 的脚本&#xff1b;只有在等到 js 脚本执行…

try、catch、finally、return执行顺序超详解析与throw与throws区别

try、catch、finally、return执行顺序超详解析&#xff08;针对面试题&#xff09; 有关try、catch、finally和return执行顺序的题目在面试题中可谓是频频出现。总结一下此类问题几种情况。 写在前面 不管try中是否出现异常&#xff0c;finally块中的代码都会执行&#xff1b…

IPguard与Ping32敏感内容防护能力对比,两款知名防泄密软件对比

在信息安全的新时代&#xff0c;企业面临着日益严重的敏感内容泄露风险。为了保障数据安全&#xff0c;选择合适的防护工具至关重要。IPguard与Ping32作为市场上两款知名的终端管理解决方案&#xff0c;各自具备独特的敏感内容防护能力。本文将对这两者进行深入对比&#xff0c…

kubeadm 搭建k8s 1.28.2版本集群

kubeadm 搭建k8s 1.28.2版本集群 1、kubuadm介绍&#xff1a; kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具&#xff0c;这个工具能通过两条指令完成一个kubernetes 集群的部署&#xff1a; 创建一个Master 节点kubeadm init将Node 节点加入到当前集群中…

minio集群部署

最近接触到minio&#xff0c; 将本地集群部署&#xff0c;分别在ubuntu、centos stream9上进行了搭建&#xff0c;目前看里面的小坑不小&#xff0c;记录以下教程&#xff0c;以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求&#xff0c;集群部署必须使用挂载非 roo…

Java基础:字符串详解

1 深入解读String类源码 1.1 String类的声明 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence { }String类是final的&#xff0c;意味着它不能被子类继承&#xff1b;String 类实现了Serializable接口&#xff0c;意味着…

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇&#xff0c;真是让人感同身受。 第一天就遇到挫折&#xff0c;因为工作做得太快、太早交付&#xff0c;结果反被领导批评&#xff0c;还得重做&#xff0c;头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗&#xff1f;…

Hunuan-DiT代码阅读

一 整体架构 该模型是以SD为基础的文生图模型&#xff0c;具体扩散模型原理参考https://zhouyifan.net/2023/07/07/20230330-diffusion-model/&#xff0c;代码地址https://github.com/Tencent/HunyuanDiT&#xff0c;这里介绍 Full-parameter Training 二 输入数据处理 这里…

一、Spring入门

文章目录 1. 课程内容介绍2. Spring5 框架概述3. Spring5 入门案例 1. 课程内容介绍 2. Spring5 框架概述 3. Spring5 入门案例

Java反射专题

目录 一.反射机制 1.Java Reflection 2.反射相关的主要类 3.反射的优缺点 4.反射调用优化—关闭访问检查 二.Class类 1.基本介绍 2.常用方法 3.获取Class对象的方式 4.那些类型有Class对象 三.类加载 1.介绍 2.类加载时机 3.类加载各阶段 四.获取类结构的信息 1…

25.第二阶段x86游戏实战2-背包属性补充

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

机器学习项目——运用机器学习洞察青年消费趋势

1. 项目背景 在21世纪的第三个十年&#xff0c;全球经济和技术的飞速发展正深刻影响着各个领域&#xff0c;尤其是青年消费市场。随着数字化进程的加速&#xff0c;尤其是移动互联网的广泛普及&#xff0c;青年的消费行为和生活方式发生了前所未有的转变。 然而&#xff0c;面对…