【编程题目 |200分】内存资源分配【2021 H1,H2, 2022 H1考试题】


相似题目:华为机试内存资源分配-大厂笔经 (online1987.com)


时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

64bit IO Format:%lld


本题可使用本地IDE编码,不能使用本地已有代码,无跳出限制,

编码后请点击”保存并调试“按钮进行代码提交。


题目描述

【内存资源分配】

有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源返回申请结果成功失败列表。

分配规则如下:

  1. 分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度小的,但内存不能拆分使用;
  2. 需要按申请顺序分配,先申请的先分配,有可用内存分配则申请结果为true;
  3. 没有可用则返回false。

注意:不考虑内存释放

输入描述

输入为两行字符串

第一行为内存池资源列表

包含内存粒度数据信息,粒度数据间用逗号分割

一个粒度信息内用冒号分割

冒号前为内存粒度大小,冒号后为数量

资源列表不大于1024

每个粒度的数量不大于4096

第二行为申请列表

申请的内存大小间用逗号分割,申请列表不大于100000

64:2,128:1,32:4,1:128

50,36,64,128,127

输出描述

输出为内存池分配结果

如true,true,true,false,false

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

输入

64:2,128:1,32:4,1:128

50,36,64,128,127

输出

true,true,true,false,false


代码实现


C++解法一


#include<bits/stdc++.h>

using namespace std;

#define LOWBOUND 1 << 10
#define UPBOUND 1e5
#define IOS                     \
    cin.sync_with_stdio(false); \
    cin.tie(nullptr);           \
    cout.tie(nullptr);
#define SZ(x) ((int) (x).size())

class Solution {
public:
    // 待实现函数,在此函数中填入答题代码;
    string memoryResourceAllocate(string memoryPoolInfo, string applications) 
    {
        vector <string> memorys;
        vector<int> apps;
        SplitString(memoryPoolInfo, memorys, ",");
        SplitInt(applications, apps, ',');

剩余50%内容,订阅会员后查看


隐藏内容

此处内容需要权限查看

  • 普通用户特权:11金币
  • 会员用户特权:免费
  • 永久会员用户特权:免费推荐
会员免费查看

C++解法二


#include<bits/stdc++.h>

using namespace std;

剩余50%内容,订阅会员后查看


隐藏内容

此处内容需要权限查看

  • 普通用户特权:11金币
  • 会员用户特权:免费
  • 永久会员用户特权:免费推荐
会员免费查看

JAVA解法一


import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.TreeMap;

public class MemoryAllocation {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        TreeMap<Integer, Integer> pool = new TreeMap<>();

剩余50%内容,订阅会员后查看


隐藏内容

此处内容需要权限查看

  • 普通用户特权:11金币
  • 会员用户特权:免费
  • 永久会员用户特权:免费推荐
会员免费查看

JAVA解法二


import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split(",");
        String[] apply = sc.nextLine().split(",");

剩余50%内容,订阅会员后查看


隐藏内容

此处内容需要权限查看

  • 普通用户特权:11金币
  • 会员用户特权:免费
  • 永久会员用户特权:免费推荐
会员免费查看

Python解法一


import collections

if __name__ == "__main__":
    s = input().split(',')
    re = list(map(int, input().split(',')))

剩余50%内容,订阅会员后查看


隐藏内容

此处内容需要权限查看

  • 普通用户特权:11金币
  • 会员用户特权:免费
  • 永久会员用户特权:免费推荐
会员免费查看

Python解法二


S1 = "64:2,128:1,32:4,1:128"
S2 = "50,36,64,128,127"
import re

Dicts = dict()
for x in S1.split(","):

剩余50%内容,订阅会员后查看


隐藏内容

此处内容需要权限查看

  • 普通用户特权:11金币
  • 会员用户特权:免费
  • 永久会员用户特权:免费推荐
会员免费查看