1. Job Roadmap
  2. Home
  3. Problem Set
  4. codenotelist
  5. Forum
  6. course
  7. Shore Share Sessions
  8. Record
  1. Login
  2. Sign Up
  3. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
    ZhContent TextSol AI分析

解题思路

  1. 数据还原(字节串 → 位串)

    • 输入给出的是若干个十进制数字,每个数字是一个 byte(8 位)。

    • 每个 bit 表示一个内存单元是否空闲:

      • bit = 1 表示这个单元空闲
      • bit = 0 表示这个单元已使用

P4466.第1题-查找可用内存块

    1000ms Tried: 469 Accepted: 37 Difficulty: 5 所属公司 : 华为
    算法与标签>模拟

题目内容

有一个由若干个连续的内存单元组成的一个环形的内存块,我们现在需要从这个内存块中某个内存单元后申请指定大小的连续内存。

为了方便描述我们进行以下约定:

  1. 我们用一个101010进制byte数字序列来描述这个内存块的现状;其中每一个数字为111个bytebytebyte,表示内存块中888个连续的内存单元,它的每一个bitbitbit的值用于描述111个内存单元是否使用,bitbitbit为000时表示内存已使用,111表示空闲。

  2. 我们对环形内存块的每一个内存单元进行编号,假设数字序列共有nnn个数字,数字序列的第111个数的bit0bit0bit0到bit7bit7bit7,依次对应编号为000~777的内存单元;第222个数的bit0bit0bit0到bit7bit7bit7依次对应编号为8~15的内存单元,依次类推。第n个数字对应8n−88n-88n−8~8n−18n-18n−1的内存单元。从000到8n−18n-18n−1编号的内存单元按照物理上连续,编号越大,内存单元越高。编号000和8n−18n-18n−1的两个首尾内存单元相邻构成环状的内存。

现在需要在这个连续的内存块中的指定编号为mmm的内存单元之后(顺时针),找到长度为k的连续未使用的内存块,按以下规则优先进行匹配:

  1. 查找方向是从[m+1,8n−1][m+1, 8n-1][m+1,8n−1]和[0,m][0, m][0,m]回环次序查找满足条件的连续未使用的内存单元段。

  2. 当有多个内存段满足条件时,优先在大小最接近申请大小连续内存段中,申请起始编号距离mmm最近的内存段。

  3. 编号距离计算方式如下:

j>mj > mj>m时,距离j−mj - mj−m

j<mj < mj<m时,距离j+8n−mj + 8n - mj+8n−m

输入描述

输入是一个字符串数字序列,至少包括2行:

第111行有两个数字:第111个数字:申请的连续单元个数nnn,范围:000~655356553565535

第222个数字:mmm,在这个编号的内存单元后开始查找,范围:000~360036003600;

从第222行开始为描述内存块的数字序列(可能存在换行符)。数字之间可用空格或者换行隔开,最多500500500个数字,每个数字范围是000~255255255。

比如输入:

1 21\ 21 2

128 64128\ 64128 64

表示在bitbitbit序列(编号000~151515)为10000000 1000000010000000\ 1000000010000000 10000000(从左到右对应编号低到高)的内存块中,从编号为222的内存单元(第222个bitbitbit)后申请111个内存单元。

输出描述

输出申请满足申请的内存段的起始内存单元编号。

如果不存在满足的内存段,输出−1-1−1。

样例1

输入

3 6
59 143

输出

15 

说明

样例的目的是从状态为11011100 11110001(从左到右依次为编号0~编号15的内存单元使用状态)内存块中

从编号为6的内存单元后申请3个连续的内存单元。

经扫描找出3个内存段满足这点,分别为:

  1. 编号8到编号11有4个内存单元

  2. 编号15到编号1有3个内存单元

  3. 编号3到编号5有3个内存单元

其长度最匹配的段是第2段和第3段,在这里面距离编号为6的距离分别是:

第3段:距离为9

第2段:距离为3+16-6=13

最匹配的是第2段,在其内申请3的内存单元,起始地址为15。

样例2

输入

3 1
6 17

输出

-1

样例3

输入

3 1
0 0

输出

-1

说明

本样例的目的是从状态为00000000 00000000(从左到右依次为编号0~编号15的内存单元使用状态)内存块中

申请3个连续的内存单元,从编号为1的内存单元后开始进行申请。

经过查找没有一个连续内存块有3个连续未使用内存单元,因此结果为-1。

样例4

输入

2 1
0 254

输出

9

说明

本样例的目的是从状态为 00000000 01111111 (从左到右依次为编号 0~编号15 的内存单元(用 0 表示空) 内存块中

申请 2 个连续的内存单元。从编号为 1 的内存单元后开始进行申请。

经过计算,只有 1 个连续的空内存块:从编号 9 到编号 15。可以申请 2 个连续未使用的内存单元。这里面编号为 10 的内存单元最近的内存是 9~10。因此结果为 9

提示

可能 m 的大小小于内存单元的个数,此时返回 1,在失败场景下,返回 -1

登录后即可使用 AI 分析。

模式
倒计时时长
:

最长 10 小时 59 分;应用后按此时长重新开始。

提示:点击提交记录在左侧题面区域查看详情
题库
AI分析设置
留空使用官方API Key,每天有次数限制(自定义API Key仅限会员和管理员使用,不限次数)
会员和管理员可切换模型;切到 Kimi/智谱/通义/豆包时需填写对应供应商 API Key
升级会员,可将运行与提交冷却时间缩短至 1 秒起

Status

  • Judging Queue
  • Service Status

Development

  • Open Source

Support

  • Help
  • Contact Us

About

  • About
  • Privacy
  • Terms of Service
  • Copyright Complaint
  1. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
  2. Legacy mode
  3. Theme
    1. Light
    2. Dark
  1. 京ICP备2025123107号-1
  2. Worker 0, 106ms
  3. Powered by Hydro v5.0.0-beta.18 Community
CLOSE


ScanQRCodePrompt

请使用微信扫描下方二维码完成注册

Forgot password or username?