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

【华为OD-E卷-AI处理器组合100分(python、java、c++、js、c)】

【华为OD-E卷-AI处理器组合100分(python、java、c++、js、c)】

题目

某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。
编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信。如下图所示:
现给定服务器可用的处理器编号数组array,以及任务申请的处理器数量num,找出符合下列亲和性调度原则的芯片组合。
如果不存在符合要求的组合,则返回空列表。
亲和性调度原则:
如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。 如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。 如果申请处理器个数为4,则必须选择同一链路剩余可用的处理器数量为4个。 如果申请处理器个数为8,则申请节点所有8个处理器。 提示:
任务申请的处理器数量只能是1、2、4、8。 编号0-3的处理器处于一个链路,编号4-7的处理器处于另外一个链路。 处理器编号唯一,且不存在相同编号处理器。

输入描述

  • 输入包含可用的处理器编号数组array,以及任务申请的处理器数量num两个部分。

第一行为array,第二行为num。例如:

[0, 1, 4, 5, 6, 7]
1

表示当前编号为0、1、4、5、6、7的处理器可用。任务申请1个处理器。

0 <= array.length <= 8 0 <= array[i] <= 7 num in [1, 2, 4, 8] 输出描述 输出为组合列表,当array=[0,1,4,5,6,7],num=1 时,输出为[[0], [1]]。

用例

用例一:
输入:
[0, 1, 4, 5, 6, 7]
1
输出:
[[0], [1]]
用例二:
输入:
[0, 1, 4, 5, 6, 7]
4
输出:
[[4, 5, 6, 7]]

说明

根据第三条亲和性调度原则,必须选择同一链路剩余可用的处理器数量为4个的环

python解法

  • 解题思路:
  • 这个问题是关于处理一个数组 arr,并根据给定的数字 num 对该数组进行不同方式的调度。调度的方式依赖于以下几个步骤:

初始化与分组:首先将输入数组 arr 排序,然后将数组中的元素分成两个子列表 link1 和 link2,其中 link1 包含所有小于4的元素,link2 包含所有大于等于4的元素。

调度规则:根据输入的 num 值,决定如何处理这两个子列表:

num = 1:选择长度为 1、2、3 或 4 的组合进行调度。
num = 2:选择长度为 2、3 或 4 的组合进行调度。
num = 4:只调度长度为 4 的子列表。
num = 8:如果 link1 和 link2 都有长度为 4 的元素,将它们合并并进行调度。
深度优先搜索(DFS):使用递归的 DFS 方法来枚举 link1 和 link2 中所有可能的子集组合,根据 num 的值来决定每次深度遍历的层数。每次递归都会生成不同长度的组合,并最终返回所有可能的调度结果。

class ProcessorScheduler:def __init__(self, arr, num):# 初始化,arr是输入的数组,num是调度的规则self.arr = sorted(arr)  # 排序输入数组self.num = num  # 设定调度规则self.link1 = []  # 小于4的元素self.link2 = []  # 大于等于4的元素self.result = []  # 存储调度结果def split_links(self):# 根据元素大小将arr分成两个子列表for e in self.arr:if e < 4:self.link1.append(e)else:self.link2.append(e)def schedule(self):# 根据num值来选择调度方式self.split_links()  # 先分组len1 = len(self.link1)len2 = len(self.link2)if self.num == 1:self._schedule_one(len1, len2)elif self.num == 2:self._schedule_two(len1, len2)elif self.num == 4:self._schedule_four(len1, len2)elif self.num == 8:self._schedule_eight(len1, len2)return self.resultdef _schedule_one(self, len1, len2):# 处理num为1的情况,根据长度分别递归调度if len1 == 1 or len2 == 1:if len1 == 1:self._dfs(self.link1, 1)if len2 == 1:self._dfs(self.link2, 1)elif len1 == 3 or len2 == 3:if len1 == 3:self._dfs(self.link1, 1)if len2 == 3:self._dfs(self.link2, 1)elif len1 == 2 or len2 == 2:if len1 == 2:self._dfs(self.link1, 1)if len2 == 2:self._dfs(self.link2, 1)elif len1 == 4 or len2 == 4:if len1 == 4:self._dfs(self.link1, 1)if len2 == 4:self._dfs(self.link2, 1)def _schedule_two(self, len1, len2):# 处理num为2的情况,根据长度分别递归调度if len1 == 2 or len2 == 2:if len1 == 2:self._dfs(self.link1, 2)if len2 == 2:self._dfs(self.link2, 2)elif len1 == 4 or len2 == 4:if len1 == 4:self._dfs(self.link1, 2)if len2 == 4:self._dfs(self.link2, 2)elif len1 == 3 or len2 == 3:if len1 == 3:self._dfs(self.link1, 2)if len2 == 3:self._dfs(self.link2, 2)def _schedule_four(self, len1, len2):# 处理num为4的情况,只调度长度为4的子列表if len1 == 4:self.result.append(self.link1)if len2 == 4:self.result.append(self.link2)def _schedule_eight(self, len1, len2):# 处理num为8的情况,如果link1和link2都有长度为4的元素,合并调度if len1 == 4 and len2 == 4:self.result.append(self.link1 + self.link2)def _dfs(self, arr, level):# 通过深度优先搜索枚举所有可能的组合path = []self._dfs_helper(arr, 0, level, path)def _dfs_helper(self, arr, index, level, path):# 递归函数,生成长度为level的子集if len(path) == level:self.result.append(path[:])  # 如果路径长度符合条件,保存该组合returnfor i in range(index, len(arr)):path.append(arr[i])  # 选择当前元素self._dfs_helper(arr, i + 1, level, path)  # 递归选择下一个元素path.pop()  # 回溯,移除当前元素if __name__ == "__main__":arr = eval(input())  # 输入数组num = int(input())  # 输入调度规则scheduler = ProcessorScheduler(arr, num)print(scheduler.schedule())  # 输出调度结果

java解法

  • 解题思路
  • 该题目要求根据给定的数组和一个调度级别 num,从数组中生成符合条件的组合。具体而言,数组中的元素根据大小被分为两组:link1(包含小于 4 的元素)和 link2(包含大于等于 4 的元素)。根据不同的调度级别 num,选择合适的组合方式:

调度级别为 1 或 2:

从 link1 和 link2 中分别生成大小为 num 的所有组合。
调度级别为 4:

如果 link1 或 link2 中有正好 4 个元素,将其加入结果。
调度级别为 8:

如果 link1 和 link2 都有 4 个元素,则将两者合并,并将合并后的结果加入到结果中。

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取输入数组并将其转换为 Integer 数组Integer[] arr = Arrays.stream(sc.nextLine().split("[\\[\\]\\,\\s]")).filter(str -> !"".equals(str))  // 去除空字符串.map(Integer::parseInt)  // 转换为整数.toArray(Integer[]::new);  // 转换为 Integer 数组// 读取调度级别 numint num = sc.nextInt();// 调用 findProcessorCombinations 方法计算并打印结果System.out.println(findProcessorCombinations(arr, num));}// 主计算方法:根据调度级别生成符合条件的组合public static List<List<Integer>> findProcessorCombinations(Integer[] arr, int num) {List<List<Integer>> result = new ArrayList<>();  // 存储最终结果List<Integer> link1 = new ArrayList<>();  // 存储小于4的元素List<Integer> link2 = new ArrayList<>();  // 存储大于等于4的元素// 遍历数组,将元素根据大小分配到 link1 或 link2 中for (int p : arr) {if (p < 4) {link1.add(p);  // 小于4的元素加入 link1} else {link2.add(p);  // 大于等于4的元素加入 link2}}// 根据调度级别调用不同的生成组合的方法if (num == 1 || num == 2) {findCombinations(link1, num, result);  // 从 link1 中找大小为 num 的组合findCombinations(link2, num, result);  // 从 link2 中找大小为 num 的组合} else if (num == 4) {// 如果 link1 或 link2 有正好 4 个元素,将其加入结果if (link1.size() == 4) result.add(new ArrayList<>(link1));if (link2.size() == 4) result.add(new ArrayList<>(link2));} else if (num == 8 && link1.size() == 4 && link2.size() == 4) {// 如果 link1 和 link2 都有 4 个元素,合并它们List<Integer> combined = new ArrayList<>(link1);combined.addAll(link2);result.add(combined);}return result;  // 返回最终的组合结果}// 找到从 link 中选取 num 个元素的所有组合private static void findCombinations(List<Integer> link, int num, List<List<Integer>> result) {if (link.size() >= num) {// 如果 link 中的元素数量大于或等于 num,调用回溯算法生成所有组合backtrack(link, new ArrayList<>(), 0, num, result);}}// 回溯算法:生成所有符合条件的组合private static void backtrack(List<Integer> link, List<Integer> current, int start, int num, List<List<Integer>> result) {if (current.size() == num) {// 如果当前组合的大小等于 num,将其加入结果result.add(new ArrayList<>(current));return;}// 遍历 link 中的元素,生成组合for (int i = start; i < link.size(); i++) {current.add(link.get(i));  // 将当前元素加入组合backtrack(link, current, i + 1, num, result);  // 递归生成剩余的组合current.remove(current.size() - 1);  // 回溯,移除最后一个元素}}
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
题目整理、思路解题不易,如对您有帮助,欢迎点赞/收藏 O(∩_∩)O

相关文章:

【华为OD-E卷-AI处理器组合100分(python、java、c++、js、c)】

【华为OD-E卷-AI处理器组合100分&#xff08;python、java、c、js、c&#xff09;】 题目 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器&#xff0c;编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中&#xff0c;编号4-7的处理器处于另…...

语音识别基础算法——动态时间规整算法

前言 动态时间规整算法&#xff0c;Dynamic Time Wraping&#xff0c;缩写为DTW&#xff0c;是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为&#xff1a;在识别阶段&#xff0c;将输入…...

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产&#xff0c;模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中&#xff0c;模型减面工作是同时关乎质量和性能这两个要素的重要工…...

解读一个新建的 Spring Boot 项目

解读一个新建的 Spring Boot 项目。 1. 创建 Spring Boot 2.5.6 项目 步骤 1: 使用 Spring Initializr 创建项目 可以使用 Spring Initializr&#xff08;https://start.spring.io/&#xff09;来快速生成一个 Spring Boot 项目。 在 Spring Initializr 中选择以下配置&…...

Vue多页面路由与模版解析

上篇文章中我们成功打包并输出了多页文件&#xff0c;而构建一个多页应用能够让我们进一步了解项目配置的可拓展性&#xff0c;可以对学习 Vue 和 webpack 起到强化训练的效果&#xff0c;本文将在此基础上主要针对多页路由及模板的配置进行系列的介绍。 本案例代码地址&#…...

Python爬虫(二)- Requests 高级使用教程

文章目录 前言一、Session 对象1. 简介2. 跨请求保持 Cookie3. 设置缺省数据4. 方法级别参数不被跨请求保持5. 会话作为上下文管理器6. 移除字典参数中的值 二、请求与响应1. 请求与响应对象1.1 获取响应头信息1.2 获取发送到服务器的请求头信息 三、SSL 证书验证1. 忽略 SSL 证…...

并联带阻滤波器带通滤波器对幅值和相位的影响(IIR)

一、背景 输入信号input分别经过bp(带通滤波器)和bs&#xff08;带阻滤波器&#xff09;处理后相加输出。分析输出信号的幅值和相位受到的影响。 根据上图公式推导可知&#xff0c;并联滤波器对输出的影响可以直接分析&#xff0c;带通滤波器与带阻滤波器在频域上的加和。 二、…...

攻防世界web新手第五题supersqli

这是题目&#xff0c;题目看起来像是sql注入的题&#xff0c;先试一下最常规的&#xff0c;输入1&#xff0c;回显正常 输入1‘&#xff0c;显示错误 尝试加上注释符号#或者–或者%23&#xff08;注释掉后面语句&#xff0c;使1后面的单引号与前面的单引号成功匹配就不会报错…...

vue3学习笔记(10)-$subscribe,store组合式写法

1.$subscribe订阅&#xff0c;监视vuex中数据得修改 2.localStorage里面穿的都是字符串&#xff0c;关掉浏览器数据还在 只能获取字符串&#xff0c;用ts语法写明&#xff0c;作为字符串使用 3.组合式写法...

操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个

Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个关键性规范的零星任务的可调度性分析 目录 一、论文核心思想 二、基本定义 2.1 关键性指标 2.2 任务及相关参数定义 2.3 几个基础定义 三、可调度性分析 3.1 调度算法分…...

计算机网络与通信复习

因特网的核心部分&#xff08;电路交换与分组交换的不同点&#xff0c;分组交换的优点&#xff09; 核心部分&#xff1a;路由器、交换机 我们假如数据就是一个货物&#xff0c;比如说一千公斤的大米&#xff0c;电路交换要有专用通道&#xff0c;不管从起点到终点经过多少个…...

【Scala】图书项目系统代码演练3.1/BookService

package org.app package serviceimport models.{BookModel, BorrowRecordModel}import org.app.dao.{BookDAO, BorrowRecordDAO}import java.time.LocalDateTime import scala.collection.mutable.ListBuffer// 图书业务逻辑层 class BookService {private val bookDAO new B…...

人工智能基础软件-Jupyter Notebook

简介&#xff1a; Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。 Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直…...

C++ 设计模式:模板方法(Template Method)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 策略模式 链接&#xff1a;C 设计模式 - 观察者模式 模板方法&#xff08;Template Method&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。通过这…...

GDPU Vue前端框架开发 跨年大礼包

目录 选择题 填空题 简答题 记住&#xff0c;年底陪你跨年的不会仅是方便面跟你的闺蜜&#xff0c;还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根…...

搭建一个高效且安全的APP分发平台

搭建一个高效且安全的APP分发平台需要经历一系列精心规划和实施的步骤。以下是一个详细的指南&#xff0c;涵盖从准备阶段到后续维护阶段的各个环节&#xff1a; 一、准备阶段 明确目标与需求 确定平台的目标用户群体&#xff0c;了解他们的需求和偏好。分析竞争对手的分发平台…...

Leetcode打卡:二叉树中的链表

执行结果&#xff1a;通过 题目 1367 二叉树中的链表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。 如果在二叉树中&#xff0c;存在一条一直向下的路径&#xff0c;且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值&#xff0c;那么请你返回 …...

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…...

算法 class 004(选择,冒泡,插入)

选择排序&#xff1a; 刚进入 j 循环的样子 j 跳出循环后&#xff0c;b 指向最小值的坐标 然后交换 i 和 b 位置的 值 随后 i , b i , i j1; 开始新一轮的排序&#xff0c; void SelectAQort(int* arr,int size)//选择排序 {for (int i 0; i < size-1; i){ //i 的位置就是…...

linux---awk命令详细教程

awk是一种强大的编程语言&#xff0c;用于在Linux/Unix系统下对文本和数据进行处理。以下是对awk的详细教程&#xff1a; 一、awk简介 awk由Alfred Aho、Brian Kernighan和Peter Weinberger三人开发&#xff0c;其名称分别代表这三位作者姓氏的第一个字母。awk支持用户自定义…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...