池化资源共享
华为OD机考2025年5月9号切换正式机考题库为2025B卷,现在刷2025B卷真题,通过率将大大提高,刷得越多,通过率越高。专栏所有题目提供详细的思路讲解,多语言(C++、JAVA、Python、GO、JavaScript)源码实现,并提供
在线OJ系统在线刷题服务。
华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解
题目描述
有一个局部互联区域内的 n 台设备,每台设备都有一定数量的空闲资源,这些资源可以池化共享。用户会发起两种操作:
- 申请资源:输入
1 x,表示本次申请需要 x 个资源。系统要返回当前资源池中能满足此申请且剩余资源最少的设备 ID;如果有多台设备满足条件,返回设备 ID 最小的;如果没有任何设备能满足,返回0并不做任何分配。 - 释放资源:输入
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)
}
}