华为OD机试之处理器问题(Java源码)

处理器问题

题目描述

某公司研发了一款高性能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。\n编号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, 2, 3)中选择处理器。

由于只有0和1可用,则返回任意一颗处理器即可。

输入[0, 1, 4, 5, 6, 7]
4
输出[[4, 5, 6, 7]]
说明根据第三条亲和性调度原则,必须选择同一链路剩余可用的处理器数量为4个的环

解析

可以把亲和性调度原则封装为一个Map集合。如下
在这里插入图片描述

Java源码示例

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class T23 {

	public static void main(String[] args) {
		String input = "0,1,4,5,6,7";
		int applyNum = 1;
		String[] cArr = input.split(",");
		List<Integer> link1 = new ArrayList<Integer>();
		List<Integer> link2 = new ArrayList<Integer>();
		for (String item : cArr) {
			int num = Integer.parseInt(item);
			if (num <= 3) {
				link1.add(num);
			} else {
				link2.add(num);
			}
		}
		System.out.println(link1);
		System.out.println(link2);
		/**
		 * -如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。
		 * -如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。
		 * -如果申请处理器个数为4,则必须选择同一链路剩余可用的处理器数量为4个。 -如果申请处理器个数为8,则申请节点所有8个处理器。
		 */
		Map<Integer, Integer[]> map = new HashMap<Integer, Integer[]>();
		Integer[] pri1 = { 1, 3, 2, 4 };
		Integer[] pri2 = { 2, 4, 3 };
		Integer[] pri4 = { 4 };
		Integer[] pri8 = { 8 };
		map.put(1, pri1);
		map.put(2, pri2);
		map.put(4, pri4);
		map.put(8, pri8);

		switch (applyNum) {
		case 1:
			Integer[] pri = map.get(1);
			for (int i = 0; i < pri.length; i++) {
				if (link1.size() == link2.size()) {
					// 两个一样多,那么就任意取一个
					List<List<Integer>> result = new ArrayList<>();
					for (Integer item : link1) {
						List<Integer> itemList = new ArrayList<>();
						itemList.add(item);
						result.add(itemList);
					}
					for (Integer item : link2) {
						List<Integer> itemList = new ArrayList<>();
						itemList.add(item);
						result.add(itemList);
					}
					System.out.println(result);
					break;
				}
				if (link1.size() == pri[i]) {
					// 输出link1内的内容
					List<List<Integer>> result = new ArrayList<>();
					for (Integer item : link1) {
						List<Integer> itemList = new ArrayList<>();
						itemList.add(item);
						result.add(itemList);
					}
					System.out.println(result);
					break;
				}
				if (link2.size() == pri[i]) {
					// 输出link1内的内容
					List<List<Integer>> result = new ArrayList<>();
					for (Integer item : link2) {
						List<Integer> itemList = new ArrayList<>();
						itemList.add(item);
						result.add(itemList);
					}
					System.out.println(result);
					break;
				}
			}
			break;
		case 2:
			Integer[] priTwo = map.get(2);
			for (int i = 0; i < priTwo.length; i++) {
				if (link1.size() == link2.size()) {
					// 随机取出2个
					ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
					result.addAll(getRandom(link1, applyNum));
					result.addAll(getRandom(link2, applyNum));
					System.out.println(result);
					break;
				}
				if(link1.size()==priTwo[i]){
					ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
					result.addAll(getRandom(link1, applyNum));
					System.out.println(result);
					break;
				}
				if(link2.size()==priTwo[i]){
					ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
					result.addAll(getRandom(link2, applyNum));
					System.out.println(result);
					break;
				}
			}
			break;
		case 4:
			if(link1.size()==link2.size()&&link1.size()==4){
				ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
				List<Integer> itemList = new ArrayList<>();
				itemList.addAll(link1);
				result.add(itemList);
				itemList = new ArrayList<>();
				itemList.addAll(link2);
				result.add(itemList);
				System.out.println(result);
				break;
			}
			if (link1.size() == 4) {
				ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
				List<Integer> itemList = new ArrayList<>();
				itemList.addAll(link1);
				result.add(itemList);
				System.out.println(result);
				break;
			}
			if (link2.size() == 4) {
				ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
				List<Integer> itemList = new ArrayList<>();
				itemList.addAll(link2);
				result.add(itemList);
				System.out.println(result);
			}
			break;
		case 8:
			if (link1.size() == 4 && link2.size() == 4) {
				ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();
				List<Integer> itemList = new ArrayList<>();
				itemList.addAll(link1);
				itemList.addAll(link2);
				result.add(itemList);
				System.out.println(result);
			}
			break;
		default:
			break;
		}
	}

	// 随机产生随机下标
	static List<List<Integer>> getRandom(List<Integer> link, int num) {
		List<List<Integer>> resultList = new ArrayList<>();
		if (link.size() == num) {
			resultList.add(link);
		} else if (link.size() > num) {
			// 长度是4 取2个 长度4取3个
			// 长度3取2个
			if (link.size() == 4 && num == 2) {
				List<Integer> items = new ArrayList<>();
				items.add(link.get(0));
				items.add(link.get(1));
				resultList.add(items);

				items = new ArrayList<>();
				items.add(link.get(0));
				items.add(link.get(2));
				resultList.add(items);

				items = new ArrayList<>();
				items.add(link.get(0));
				items.add(link.get(3));
				resultList.add(items);

				items = new ArrayList<>();
				items.add(link.get(1));
				items.add(link.get(2));
				resultList.add(items);

				items = new ArrayList<>();
				items.add(link.get(1));
				items.add(link.get(3));
				resultList.add(items);

				items = new ArrayList<>();
				items.add(link.get(2));
				items.add(link.get(3));
				resultList.add(items);
			} else if (link.size() == 3 && num == 2) {
				List<Integer> items = new ArrayList<>();
				items.add(link.get(0));
				items.add(link.get(1));
				resultList.add(items);

				items = new ArrayList<>();
				items.add(link.get(0));
				items.add(link.get(2));
				resultList.add(items);
				
				items = new ArrayList<>();
				items.add(link.get(1));
				items.add(link.get(2));
				resultList.add(items);
			}

		}
		return resultList;
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于html+css的图展示97

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安装Arch Linux后要做的十件事

Arch Linux 是一款轻量级、灵活且高度可定制的Linux发行版&#xff0c;被广泛用于个人电脑和服务器。一旦您成功安装了Arch Linux&#xff0c;接下来有一些重要的任务需要完成&#xff0c;以确保系统的稳定性和安全性&#xff0c;并为您的需求做好准备。 本文将详细介绍安装Ar…

【Android】配置不同的开发和生产环境

目录 前言 配置build.gradle&#xff08;Module级别&#xff09; 创建对应环境的目录 切换不同环境 ​编辑选择打包的环境 前言 在web开发中不同的环境对应的配置不一样&#xff0c;比如开发环境的url是这样&#xff0c;测试环境的url是那样的&#xff0c;在app中也会涉…

jdk15至17——sealed密封关键字

sealed关键字是从jdk15开始预览&#xff0c;直到jdk17成为正式版&#xff0c;可以对继承父类和实现接口进行更加细粒度的限制&#xff0c;之前的限制也只有final用于禁止继承&#xff0c;默认包权限限制在同一个包内&#xff0c;sealed密封类/接口可以明确指定哪些类可以进行继…

通过Python的PIL库给图片添加马赛克

文章目录 前言一、Pillow是什么&#xff1f;二、安装PIL库三、查看PIL库版本四、使用方法1.引入库2.定义图片路径3.打开需要打马赛克的图片4.获取图片尺寸5.创建一个新的图片对象6.定义块的宽高7.循环遍历图片中的每个块进行处理8.保存马赛克图片9.效果 总结 前言 大家好&#…

客服配置-shopro

客服配置 注意事项 shopro客服系统 采用 workerman 的 gateway-worker 作为服务基础&#xff0c;请先安装 gateway-worker 扩展包shopro商城 已不再支持 workerman 在线客服插件 安装部署 安装扩展包 composer require workerman/gateway-worker:~3.0 删除禁用函数(如有未列…

C Primer Plus第十二章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.不使用全局变量&#xff0c;重写程序…

idea使用Alibaba Cloud Toolkit插件远程操作Docker

idea使用Alibaba Cloud Toolkit插件远程操作Docker 文章目录 前言一、tcp://IP:2375或者Unix socket 连接Docker(不安全)问题1&#xff1a;为什么本地虚拟机能连上&#xff0c;xxx云ECS服务器连不上&#xff1f;问题2&#xff1a;什么是Unix域套接字&#xff1f;有什么作用&…

Linux之创建进程、查看进程、进程的状态以及进程的优先级

文章目录 前言一、初识fork1.演示2.介绍3.将子进程与父进程执行的任务分离4.多进程并行 二、进程的状态1.进程的状态都有哪些&#xff1f;2.查看进程的状态2.运行&#xff08;R&#xff09;3.阻塞4.僵尸进程&#xff08;Z&#xff09;1.僵尸状态概念2.为什么要有僵尸状态&#…

伺服系统使用S曲线

在之前文章《S形曲线规划方式汇总》 介绍过贝塞尔曲线方式&#xff0c;并且在Marlin开源工程中也有贝塞尔曲线步进系统的实现方式。本篇介绍伺服系统中基于时间分割法实现的贝塞尔S曲线。 1 贝塞尔曲线路程规划 上文中推导过贝塞尔曲线&#xff0c;本文直接用结论&#xff1a…

OFGF光流引导特征:用于视频动作识别的快速且稳健的运动表示【含源码】

论文地址:https://openaccess.thecvf.com/content_cvpr_2018/papers/Sun_Optical_Flow_Guided_CVPR_2018_paper.pdf 这个 repo 包含论文的实现代码: Optical Flow Guided Feature: A Fast and Robust Motion Representation for Video Action Recognition,Shuyang Sun,Zh…

TCO-PEG-Thiol,反式环辛烯聚乙二醇巯基,具有末端硫醇基团的双功能TCO PEG衍生物

产品描述&#xff1a; TCO PEG Thiol是具有末端硫醇基团的双功能TCO PEG衍生物。TCO&#xff08;反式环辛烯&#xff09;基团与四嗪基团快速有效地反应&#xff0c;而硫醇&#xff08;巯基&#xff09;可用于与马来酰亚胺反应&#xff0c;与金表面结合并参与许多其他反应。 TC…

医疗IT系统安科瑞隔离电源装置在医院的应用

【摘要】介绍该三级综合医院采用安科瑞隔离电源系统5件套&#xff0c;使用落地式配电柜安装方式&#xff0c;从而实现将TN系统转化为IT系统&#xff0c;以及系统绝缘情况监测。 【关键词】医用隔离电源系统&#xff1b;IT系统&#xff1b;绝缘情况监测&#xff1b;三级综合医院…

Java版本企业电子招投标采购系统源码之项目说明和开发类型源码

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

办公OA系统性能分析案例

前言 信息中心老师反应&#xff0c;用户反馈办公系统有访问慢的情况&#xff0c;需要通过流量分析系统来了解系统的运行情况&#xff0c;此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量&am…

基于LeNet-5的手写数字识别实战

图像识别是计算机视觉最常用的任务之一&#xff0c;几乎所有的有关图像识别的教程都会将MNIST数据集作为入门数据集&#xff0c;因为MNIST数据集是图像识别问题中难度最小、特征差异较为明显的数据集&#xff0c;非常适合作为图像识别入门者的学习案例。本案例使用MNIST数据集&…

【k8s】【Prometheus】【待写】

环境 k8s v1.18.0 192.168.79.31 master 192.168.79.32 node-1 192.168.79.33 node-2一、Prometheus 对 kubernetes 的监控 1.1 node-exporter 组件安装和配置 node-exporter 可以采集机器&#xff08;物理机、虚拟机、云主机等&#xff09;的监控指标数据&#xff0c;能够采…

微服务开发系列 第七篇:RocketMQ

总概 A、技术栈 开发语言&#xff1a;Java 1.8数据库&#xff1a;MySQL、Redis、MongoDB、Elasticsearch微服务框架&#xff1a;Spring Cloud Alibaba微服务网关&#xff1a;Spring Cloud Gateway服务注册和配置中心&#xff1a;Nacos分布式事务&#xff1a;Seata链路追踪框架…

网络通信:http协议

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议) 就是其中之一. 认识URL 统一资源定位符(Uniform Resource Locator&#xff0c;缩写&#xff1a;URL)&#xff0c;…

DAY07_HTMLCSS

目录 1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标签1.3.5 段落标签1.3.6 加粗、斜体、下划线标签1.3.7 居中标签1.3.8 案例 1.4 图片、音频、视频标签1.5 超链接标签1.6 列表标签1.6.1 列表中图表类…