当前位置: 首页 > news >正文

【OD】【E卷】【真题】【100分】内存资源分配(PythonJavaJavaScriptC++C)

题目描述

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

分配规则如下:

  • 分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度小的,但内存不能拆分使用;
  • 需要按申请顺序分配,先申请的先分配,有可用内存分配则申请结果为true;
  • 没有可用则返回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

说明

内存池资源包含:64K共2个、128K共1个、32K共4个、1K共128个的内存资源;
针对50,36,64,128,127的内存申请序列,分配的内存依次是:64,64,128,NULL,NULL,
第三次申请内存时已经将128分配出去,因此输出结果是:
true,true,true,false,false

解题思路

规则总结:

  • 按需分配内存,不能拆分。
  • 优先分配最小的满足条件的内存块。
  • 内存池中的资源一旦分配出去,就无法再次使用。
  • 若没有可用内存块满足需求,返回 false

示例解释:

输入:

64:2,128:1,32:4,1:128
50,36,64,128,127

输出:

true,true,true,false,false
解释过程:
  1. 内存池初始化

    • 内存池资源为:

      • 64K 的内存块有 2 个。
      • 128K 的内存块有 1 个。
      • 32K 的内存块有 4 个。
      • 1K 的内存块有 128 个。
  2. 申请 50K 内存

    • 50K 需要一个大于等于 50K 的内存块。
    • 从内存池中寻找,最小满足要求的内存块是 64K,因此分配一个 64K 的内存块,成功,返回 true
    • 剩余内存池:64:1, 128:1, 32:4, 1:128。
  3. 申请 36K 内存

    • 36K 需要一个大于等于 36K 的内存块。
    • 最小满足要求的内存块是 64K,因此分配一个 64K 的内存块,成功,返回 true
    • 剩余内存池:64:0, 128:1, 32:4, 1:128。
  4. 申请 64K 内存

    • 64K 需要一个大于等于 64K 的内存块。
    • 内存池中没有剩余的 64K 内存块,唯一满足条件的内存块是 128K,因此分配一个 128K 的内存块,成功,返回 true
    • 剩余内存池:64:0, 128:0, 32:4, 1:128。
  5. 申请 128K 内存

    • 128K 需要一个大于等于 128K 的内存块。
    • 但是内存池中已经没有 128K 或更大的内存块了,分配失败,返回 false
  6. 申请 127K 内存

    • 127K 需要一个大于等于 127K 的内存块。
    • 同样,内存池中没有 128K 或更大的内存块,分配失败,返回 false

最终,输出为 true,true,true,false,false

Java

import java.util.*;public class Main {public static void main(String[] args) {// 处理输入Scanner scanner = new Scanner(System.in); // 创建一个Scanner对象,用于读取控制台的输入String memoryInfo = scanner.next(); // 读取内存池资源列表String applyList = scanner.next(); // 读取申请列表// 内存信息List<Integer> memoryList = new ArrayList<>(); // 创建一个ArrayList对象,用于存储内存池中可用的内存大小List<String> memoryInfoList = new ArrayList<>(Arrays.asList(memoryInfo.split(","))); // 将内存池资源列表按逗号分隔,转换为ArrayList对象for (String info : memoryInfoList) { // 遍历内存池资源列表int colonIndex = info.indexOf(":"); // 找到冒号的位置int size = Integer.parseInt(info.substring(0, colonIndex)); // 截取内存大小int count = Integer.parseInt(info.substring(colonIndex + 1)); // 截取内存块数量for (int i = 0; i < count; i++) { // 将内存块数量的内存大小添加到内存列表中memoryList.add(size);}}// 申请信息List<Integer> applyMemoryList = new ArrayList<>(); // 创建一个ArrayList对象,用于存储申请的内存大小List<String> applyListList = new ArrayList<>(Arrays.asList(applyList.split(","))); // 将申请列表按逗号分隔,转换为ArrayList对象for (String apply : applyListList) { // 遍历申请列表applyMemoryList.add(Integer.parseInt(apply)); // 将申请的内存大小添加到申请内存列表中}// 分配内存List<Boolean> resultList = new ArrayList<>(); // 创建一个ArrayList对象,用于存储每个申请是否成功for (int applyMemory : applyMemoryList) { // 遍历申请内存列表boolean flag = false; // 定义一个标志位,用于标记是否成功分配内存for (int i = 0; i < memoryList.size(); i++) { // 遍历内存列表if (memoryList.get(i) >= applyMemory) { // 如果当前内存块的大小大于等于申请的内存大小flag = true; // 标记成功分配内存memoryList.remove(i); // 将当前内存块从内存列表中移除break; // 跳出循环}}resultList.add(flag); // 将是否成功分配内存的结果添加到结果列表中}// 输出结果for (int i = 0; i < resultList.size(); i++) { // 遍历结果列表System.out.print(resultList.get(i)); // 输出当前申请是否成功分配内存if (i != resultList.size() - 1) { // 如果不是最后一个结果System.out.print(","); // 输出逗号分隔符}}}
}

Python

memoryInfo = input() # 读取内存池资源列表
applyList = input() # 读取申请列表# 内存信息
memoryList = [] # 创建一个列表,用于存储内存池中可用的内存大小
memoryInfoList = memoryInfo.split(",") # 将内存池资源列表按逗号分隔,转换为列表
for info in memoryInfoList: # 遍历内存池资源列表colonIndex = info.index(":") # 找到冒号的位置size = int(info[:colonIndex]) # 截取内存大小count = int(info[colonIndex + 1:]) # 截取内存块数量for i in range(count): # 将内存块数量的内存大小添加到内存列表中memoryList.append(size)# 申请信息
applyMemoryList = [] # 创建一个列表,用于存储申请的内存大小
applyListList = applyList.split(",") # 将申请列表按逗号分隔,转换为列表
for apply in applyListList: # 遍历申请列表applyMemoryList.append(int(apply)) # 将申请的内存大小添加到申请内存列表中# 分配内存
resultList = [] # 创建一个列表,用于存储每个申请是否成功
for applyMemory in applyMemoryList: # 遍历申请内存列表flag = False # 定义一个标志位,用于标记是否成功分配内存for i in range(len(memoryList)): # 遍历内存列表if memoryList[i] >= applyMemory: # 如果当前内存块的大小大于等于申请的内存大小flag = True # 标记成功分配内存memoryList.pop(i) # 将当前内存块从内存列表中移除break # 跳出循环resultList.append(flag) # 将是否成功分配内存的结果添加到结果列表中# 输出结果
for i in range(len(resultList)): # 遍历结果列表print(resultList[i], end='') # 输出当前申请是否成功分配内存if i != len(resultList) - 1: # 如果不是最后一个结果print(',', end='') # 输出逗号分隔符

JavaScript

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let memoryInfo, applyList;rl.on('line', (input) => {if (!memoryInfo) {memoryInfo = input;} else if (!applyList) {applyList = input;rl.close();}
});rl.on('close', () => {// 处理输入const memoryList = [];const memoryInfoArr = memoryInfo.split(',');for (let i = 0; i < memoryInfoArr.length; i++) {const [sizeStr, countStr] = memoryInfoArr[i].split(':');const size = parseInt(sizeStr);const count = parseInt(countStr);for (let j = 0; j < count; j++) {memoryList.push(size);}}// 申请信息const applyMemoryList = applyList.split(',').map(Number);// 分配内存const resultList = [];for (let i = 0; i < applyMemoryList.length; i++) {let flag = false;for (let j = 0; j < memoryList.length; j++) {if (memoryList[j] >= applyMemoryList[i]) {flag = true;memoryList.splice(j, 1);break;}}resultList.push(flag);}// 输出结果console.log(resultList.map((res) => res ? 'true' : 'false').join(','));
});

C++

#include <iostream>
#include <vector>
#include <sstream>using namespace std;int main() {// 处理输入string memoryInfo, applyList;cin >> memoryInfo >> applyList;// 内存信息vector<int> memoryList;stringstream ss(memoryInfo);string info;while (getline(ss, info, ',')) {int colonIndex = info.find(":");int size = stoi(info.substr(0, colonIndex));int count = stoi(info.substr(colonIndex + 1));for (int i = 0; i < count; i++) {memoryList.push_back(size);}}// 申请信息vector<int> applyMemoryList;stringstream ss2(applyList);string apply;while (getline(ss2, apply, ',')) {applyMemoryList.push_back(stoi(apply));}// 分配内存vector<bool> resultList;for (int applyMemory : applyMemoryList) {bool flag = false;for (int i = 0; i < memoryList.size(); i++) {if (memoryList[i] >= applyMemory) {flag = true;memoryList.erase(memoryList.begin() + i);break;}}resultList.push_back(flag);}// 输出结果for (int i = 0; i < resultList.size(); i++) {cout << (resultList[i] ? "true" : "false");if (i != resultList.size() - 1) {cout << ",";}}return 0;
}

C语言

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define MAX_MEMORY_BLOCKS 1000  // 最大内存块数量
#define MAX_APPLY_REQUESTS 1000 // 最大申请请求数量
#define MAX_INPUT_LENGTH 1024   // 最大输入字符串长度int main() {char memoryInfo[MAX_INPUT_LENGTH], applyList[MAX_INPUT_LENGTH];int memoryList[MAX_MEMORY_BLOCKS];   // 用于存储内存块大小的数组int memoryCount = 0;                 // 内存块总数int applyMemoryList[MAX_APPLY_REQUESTS]; // 用于存储内存申请大小的数组int applyCount = 0;                  // 申请总数int resultList[MAX_APPLY_REQUESTS];  // 用于存储每次申请结果的数组// 输入内存池信息和申请列表scanf("%s", memoryInfo);scanf("%s", applyList);// 处理内存池信息char *token = strtok(memoryInfo, ",");  // 使用strtok按逗号分割字符串while (token != NULL) {char *colon = strchr(token, ':');   // 找到冒号位置int size = atoi(token);             // 内存块大小int count = atoi(colon + 1);        // 内存块数量// 将每个内存块大小添加到内存列表中for (int i = 0; i < count; i++) {if (memoryCount < MAX_MEMORY_BLOCKS) {memoryList[memoryCount++] = size;}}token = strtok(NULL, ",");  // 获取下一个逗号分割的部分}// 处理申请列表token = strtok(applyList, ",");  // 使用strtok按逗号分割字符串while (token != NULL) {if (applyCount < MAX_APPLY_REQUESTS) {applyMemoryList[applyCount++] = atoi(token);  // 将申请大小存入数组}token = strtok(NULL, ",");  // 获取下一个逗号分割的部分}// 处理每次申请for (int i = 0; i < applyCount; i++) {int applyMemory = applyMemoryList[i];int success = 0;  // 标记是否成功分配内存// 遍历内存池,找到第一个大于等于申请大小的内存块for (int j = 0; j < memoryCount; j++) {if (memoryList[j] >= applyMemory) {success = 1;  // 找到合适的内存块// 将该内存块从数组中移除,通过覆盖方式for (int k = j; k < memoryCount - 1; k++) {memoryList[k] = memoryList[k + 1];}memoryCount--;  // 更新内存块数量break;}}resultList[i] = success;  // 记录申请结果}// 输出分配结果for (int i = 0; i < applyCount; i++) {if (resultList[i]) {printf("true");} else {printf("false");}if (i != applyCount - 1) {printf(",");}}printf("\n");return 0;
}

相关文章:

【OD】【E卷】【真题】【100分】内存资源分配(PythonJavaJavaScriptC++C)

题目描述 有一个简易内存池&#xff0c;内存按照大小粒度分类&#xff0c;每个粒度有若干个可用内存资源&#xff0c;用户会进行一系列内存申请&#xff0c;需要按需分配内存池中的资源返回申请结果成功失败列表。 分配规则如下&#xff1a; 分配的内存要大于等于内存的申请…...

Linux基础项目开发day05:量产工具——页面系统

文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统&#xff0c;现在我们就来实现页面的…...

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产&#xff0c;企业管理员必须建立高效的企业终端安全管控机制&#xff0c;确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统&#xff0c;确保任何未经授权的资产变动都能被迅…...

2024市场营销第3次课

品牌管理 1.认识品牌 品牌定义&#xff1a;一个名称、术语、标志、符号或设计&#xff0c;或者是它们的组合&#xff0c;用来识别某个销售商或某一群销售商的产品或服务&#xff0c;并使其与竞争者的产品或服务区分开来。 品牌构成&#xff1a;成功品牌的构成都是由外及内的…...

Python基础之函数的定义与调用

一、函数的定义 在Python中&#xff0c;函数是一段可重复使用的代码块&#xff0c;用于完成特定的任务。可以使用def关键字来定义函数。 语法如下&#xff1a; def function_name(parameters): """docstring""" # function body return expres…...

GPU在AI绘画中的作用以及GPU的选择

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 GPU在AI绘画中的作用&#xff1a; GPU在A…...

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置...

mysql学习教程,从入门到精通,SQL 注入(42)

1、 SQL 注入 SQL 注入是一种严重的安全漏洞&#xff0c;它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害&#xff0c;我不能提供具体的恶意代码示例。然而&#xff0c;我可以向你展示如何防御 SQL 注入&#xff0c;并解释其工作原理…...

图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】

图论day60|108.冗余连接&#xff08;卡码网&#xff09;、109.冗余连接II&#xff08;卡码网&#xff09;【并查集 摧毁信心的一题&#xff0c;胆小的走开&#xff01;】 108.冗余连接&#xff08;卡码网&#xff09;109.冗余连接II&#xff08;卡码网&#xff09;【并查集 摧毁…...

即使是编程新手,也能利用ChatGPT编写高质量的EA

在外汇交易领域&#xff0c;MetaTrader是一款备受欢迎的交易软件&#xff0c;包括MT5和MT4&#xff0c;提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言&#xff0c;编写专家顾问&#xff08;EA&#xff09;可能显得既复杂又令人望而却步。幸运的是&…...

StarRocks大批量数据导入方案-使用 Routine Load 导入数据

本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka&#xff0c;本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业&#xff08;Load job&#xff09; 导入作业会常驻运行&#xff0c;当导入作业的状态为 R…...

从零开始学PHP之输出语句变量常量

一、 输出方式 在 PHP 中输出方式&#xff1a; echo&#xff0c;print&#xff0c;print_r&#xff0c;var_dump 1、echo和print为php的输出语句 2、var_dump&#xff0c;print_r为php的输出函数 &#xff08;这里不做介绍&#xff09;echo 和 print 区别 1、echo - 可以输出…...

二叉树算法之字典树(Trie)详细解读

字典树&#xff08;Trie&#xff0c;也称前缀树或单词查找树&#xff09;是一种用于快速查找字符串的数据结构&#xff0c;主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合&#xff0c;比如单词自动补全、拼写检查等场景。 1. 字典树的…...

butterfly侧边栏音乐模块

方法1.美观但换页后没法播放 1.blog根目录/source文件夹下新建_data文件夹&#xff08;如果没有_data文件夹&#xff09; 2.在刚刚的_data文件夹里创建widget.yml文件 bottom:- class_name: user-musicid_name: user-musicname: 音乐icon: fas fa-heartbeatorder:html: <…...

【论文阅读】Detach and unite: A simple meta-transfer for few-shot learning

分离与联合&#xff1a;一种用于小样本学习的简单元迁移方法 引用&#xff1a;Zheng Y, Zhang X, Tian Z, et al. Detach and unite: A simple meta-transfer for few-shot learning[J]. Knowledge-Based Systems, 2023, 277: 110798. 论文地址&#xff1a;下载地址 论文代码&a…...

Java中的动态代理——介绍与使用示例

Java中的动态代理其实就是一种“代理”模式&#xff0c;在运行时帮我们创建一个“代理对象”&#xff0c;通过这个代理对象可以在不改变原本方法的情况下&#xff0c;做一些额外的事情&#xff0c;比如记录日志、检查权限等。这种代理机制非常灵活和实用&#xff0c;特别是在像…...

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因&#xff1a;小程序没有直接获取本地文件&#xff0c;为了提高访问速度&#xff0c;而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...

P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节

讲解视频&#xff1a; P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…...

Python | Leetcode Python题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution:def constructRectangle(self, area: int) -> List[int]:w int(sqrt(area))while area % w:w - 1return [area // w, w]...

新版vs code + Vue高亮、语法自动补全插件

vs code 版本或及以上 安装以下三个插件插件 Vetur Vue语法支持。包括语法高亮、语法代码提示、语法lint检测 ESLint语法纠错 Prettier 2.左下角设置 3.进行配置 配置内容&#xff1a; {"editor.fontSize": 20,"window.zoomLevel": 1,"workben…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...