华为OD机试 2025 B卷 - 池化资源共享 (Python & C++ & JAVA & JS & GO)

217 阅读2分钟

池化资源共享

华为OD机考2025年5月9号切换正式机考题库为2025B卷,现在刷2025B卷真题,通过率将大大提高,刷得越多,通过率越高。专栏所有题目提供详细的思路讲解,多语言(C++、JAVA、Python、GO、JavaScript)源码实现,并提供在线OJ系统在线刷题服务。

华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解

题目描述

有一个局部互联区域内的 n 台设备,每台设备都有一定数量的空闲资源,这些资源可以池化共享。用户会发起两种操作:

  1. 申请资源:输入 1 x,表示本次申请需要 x 个资源。系统要返回当前资源池中能满足此申请且剩余资源最少的设备 ID;如果有多台设备满足条件,返回设备 ID 最小的;如果没有任何设备能满足,返回 0 并不做任何分配。
  2. 释放资源:输入 2 y,表示将第 y 次申请(不一定是成功分配的那一次)释放回原设备。释放时,资源立即归还,且空闲资源自动连续,无需考虑空洞。

给定 n(1 ≤ n ≤ 1000)、操作次数 m(1 ≤ m ≤ 105),以及初始时每台设备的空闲资源数 d₁…dₙ(1 ≤ dᵢ ≤ 1000),以及接下来 m 行操作,输出每次 “申请” 操作的返回值。

输入描述

第一行,输入 n 和 m

第二行输入n台设备的初始空闲资源数。

接下来m行,输出要执行的操作。

输出描述

输出每次 “申请” 操作的返回值。

用例1

输入

2 2
100 500
1 40
1 450

输出

1 2

题解

C++、Java、Python、JavaScript、Go实现源码和详细实现思路解析,点击跳转查看

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	line1, _ := reader.ReadString('\n')
	nm := strings.Fields(line1)
	n, _ := strconv.Atoi(nm[0])
	m, _ := strconv.Atoi(nm[1])

	line2, _ := reader.ReadString('\n')
	nums := strings.Fields(line2)
	// 存储每个节点的空闲内存
	free := make([]int, n+1)
	for i := 1; i <= n; i++ {
		free[i], _ = strconv.Atoi(nums[i-1])
	}

	// 记录每一次分配的id 和 大小
	var alloc [][2]int
	var result []int

	for i := 0; i < m; i++ {
		line, _ := reader.ReadString('\n')
		parts := strings.Fields(line)
		if len(parts) < 2 {
			continue
		}
		typ, _ := strconv.Atoi(parts[0])
		x, _ := strconv.Atoi(parts[1])

		if typ == 1 {
			// 分配内存
			bestID := 0
			bestRemoveFree := 1 << 30
			for j := 1; j <= n; j++ {
				// 无法满足分配
				if free[j] < x {
					continue
				}
				rem := free[j] - x
				if bestID == 0 || bestRemoveFree > rem {
					bestID = j
					bestRemoveFree = rem
				}
			}
			// 分配失败
			if bestID == 0 {
				alloc = append(alloc, [2]int{0, 0})
			} else {
				free[bestID] -= x
				alloc = append(alloc, [2]int{bestID, x})
			}
			result = append(result, bestID)
		} else {
			// 释放内存
			if x > len(alloc) {
				continue
			}
			p := alloc[x-1]
			// 没有分配成功
			if p[0] == 0 {
				continue
			}
			free[p[0]] += p[1]
		}
	}

	// 输出结果
	for i, v := range result {
		if i > 0 {
			fmt.Print(" ")
		}
		fmt.Print(v)
	}
}