> 文章列表 > 华为OD机试-最优资源分配-2022Q4 A卷-Py/Java/JS

华为OD机试-最优资源分配-2022Q4 A卷-Py/Java/JS

华为OD机试-最优资源分配-2022Q4 A卷-Py/Java/JS

某块业务芯片最小容量单位为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.25*8=10G

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

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

输入描述
第一行一个整数M:每块芯片容量为 M*1.25G,取值范围为:1~256
第二行一个整数N:板卡包含的芯片数量,取值范围为1~32

第三行为一个字符串,表示用户配置序列:例如ACABA,长度不超过1000

输出描述
板卡上每块芯片的占用情况

备注
用户配置是按次序依次配置到芯片中,如果用户配置序列种某个配置超过了芯片总容量,丢弃该配置,继续遍历用户后续配置。
示例1: 输入输出示例仅供调试,后台判题数据一般不包含示例

输入
8

ACABA 
输出

11111000

11111111

示例2: 输入输出示例仅供调试,后台判题数据一般不包含示例

输入
8

ACBCB
输出

11111000

11111111

Java 代码

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;public class Main { public static void main(String[] args) {//处理输入Scanner in=new Scanner(System.in); int M = in.nextInt();int N = in.nextInt();String user_input = in.next();// 表示各个芯片的剩余总容量double[] used = new double[N];for (int i=0;i<N;i++) {used[i] = M*1.25;}// 按照用户配置分配每一个容量for(int i=0; i<user_input.length();i++) {double capacity = 0.0;if (user_input.charAt(i) == 'A') {capacity = 1.25;} else if (user_input.charAt(i) == 'B') {capacity = 2.5;} else {capacity = 10;}// 从第一块芯片开始分配for (int j=0;j<N;j++) {if (used[j] >= capacity) {used[j] -= capacity;break;}}}//输出for (int j=0;j<N;j++) {String output_str="";for (int k=0;k<M-used[j]/1.25;k++) {output_str += '1';}for (int i=0;i<used[j]/1.25;i++) {output_str += "0";}System.out.println(output_str);}}}

Python代码

import functools
import collections
import math
from itertools import combinations
from re import matchclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right#并查集模板
class UF:def __init__(self, n=0):self.count = nself.item = [0 for x in range(n+1)]for i in range(n):self.item[i] = idef find(self, x):if (x != self.item[x]):self.item[x] = self.find(self.item[x])return 0return xdef union_connect(self, x, y):x_item = self.find(x)y_item = self.find(y)if (x_item != y_item):self.item[y_item] = x_itemself.count-=1# 处理输入
M = int(input())
N = int(input())
user_input = input()# 表示各个芯片的剩余总容量
used = [M*1.25 for i in range(N)]# 按照用户配置分配每一个容量
for i in range(len(user_input)):capacity = 0.0if (user_input[i] == 'A'):capacity = 1.25elif (user_input[i] == 'B'):capacity = 2.5else :capacity = 10# 从第一块芯片开始分配for j in range(N):if (used[j] >= capacity):used[j] -= capacitybreak#输出
for j in range(N):output_str=""for k in range(M-int(used[j]/1.25)):output_str += '1'for i in range(int(used[j]/1.25)):output_str += "0"print(output_str)

JS代码

function main(M,N,user_input) {// 表示各个芯片的剩余总容量let used = new Array(N).fill(M*1.25)// 按照用户配置分配每一个容量for (let i=0;i<user_input.length;i++){let capacity = 0.0if (user_input[i] == 'A')capacity = 1.25else if (user_input[i] == 'B')capacity = 2.5elsecapacity = 10// 从第一块芯片开始分配for (let j=0;j<N;j++){if (used[j] >= capacity){used[j] -= capacitybreak}}}//输出for (let j=0;j<N;j++){let output_str=""for (let k=0;k<M-used[j]/1.25;k++){output_str += '1'}for (let i=0;i<used[j]/1.25;i++){output_str += "0"}console.log(output_str)}}main(8,2 ,"ACABA")