CodeForce 7 B - Memory Manager(模拟)

题目大意:给你一段内存,要你进行如下的三个操作。

1.分配内存  alloc   X ,分配连续一段长度为X的内存。

如果内存不够应该输出NULL,如果内存够就给这段内存标记一个编号。

2.擦除编号为 X的内存,erase X,  如果这段内存不存在那么输出“ILLEGAL_ERASE_ARGUMENT ”,否则什么都不输出。

3.整理内存,把所有的内存块整理到一块。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL;
const int INF = 1e9+7;
const int maxn = 1055;

int Arr[maxn];
int n, m, a, ans;
int Blocks = 0;
char op[50];

int Alloc(int a)
{
    for(int i=1; i<=m; i++)
    {
        int j = i, num = 0;
        while(Arr[j] == 0 && num != a && j <= m)
            num ++, j ++;
        if(num != a)
            i = j;
        else
        {
            Blocks ++;
            for(int k=i; k<j; k++)
                Arr[k] = Blocks;
            return Blocks;
        }
    }
    return 0;
}

int Erase(int Id)
{
    if(Id <= 0)
        return -1;
    bool flag = false;
    for(int i=1; i<=m; i++)
    {
        while(Arr[i] == Id)
            Arr[i++] = 0, flag = true;
    }
    if(flag)
        return -2;
    return -1;
}

int Defragment()
{
    for(int i=1; i<=m; i++)
    {
        if(Arr[i] == 0)
        {
            for(int j=i+1; j<=m; j++)
            {
                if(Arr[j])
                {
                    swap(Arr[i], Arr[j]);
                    break;
                }

            }
        }
    }
    return -5;
}

int main()
{

    scanf("%d %d", &n, &m);
    memset(Arr, 0, sizeof(Arr));
    while(n --)
    {
        scanf("%s", op);
        if(strcmp(op, "alloc") == 0)
        {
            scanf("%d", &a);
            ans = Alloc(a);
        }
        else if( strcmp(op, "erase") == 0 )
        {
            scanf("%d", &a);
            ans = Erase(a);
        }
        else
            ans = Defragment();

        if( ans == 0)
            puts("NULL");
        else if(ans == -1)
            puts("ILLEGAL_ERASE_ARGUMENT");
        else if(ans >= 1)
            printf("%d\n", ans);

    }

    return 0;
}
时间: 2024-12-26 13:32:26

CodeForce 7 B - Memory Manager(模拟)的相关文章

Codeforce 522C - Chicken or Fish? 模拟

//思路:因为题目是要求求出所有可能被选完的 dish,所以当之前乘客所选 dish 不确定时,将所有 dish 的数量均减一(做法是记录下来不确定的 dish 的数量):当出现第一个顾客 QAQ(不开心) 的时候,说明在他之前至少有一个 dish 已经被选完了,这时候就需要利用不确定的 dish 的数量优先构造出一个被选完的 dish(注意到之后被选择的 dish 一定不能再此刻被选完) //感觉这题要是题目读懂了就没什么难度了......弱渣这题读了好半天 Orz 1 #include "b

[CodeForces7B]Memory Manager

Translate 这个内存条一共有连续的 \(m\) 个块.给你\(n\)个操作: \(alloc\) \(x\),就是你要产生一个块,这个块的大小是\(x\).前提是:存在一个连续区间可以放下这个块.那就放下去,而且要求尽量放在前面.如果不能放就输NULL.不然就输出一个数,从\(1\)开始. \(erase\) \(x\),就是把编号为 \(x\) 的块擦除.非法擦除就输出ILLEGAL_ERASE_ARGUMENT. \(defragment\),就是重新排序,把每个块都尽量放在前面,让

Delphi DLL制作和加载 Static, Dynamic, Delayed 以及 Shared-Memory Manager

一 Dll的制作一般分为以下几步:1 在一个DLL工程里写一个过程或函数2 写一个Exports关键字,在其下写过程的名称.不用写参数和调用后缀.二 参数传递1 参数类型最好与window C++的参数类型一致.不要用DELPHI的数据类型.2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态.成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容.3 用stdcall声明后缀.4 最好大小写敏感.5 无须用far调用后缀,那只是为了与windows 1

On Memory Leaks in Java and in Android.

from:http://chaosinmotion.com/blog/?p=696 Just because it's a garbage collected language doesn't mean you can't leak memory or run out of it. Especially on Android where you get so little to begin with. Now of course sometimes the answer is that you

查看 Granted Memory

由于Sort 和 Hash (Join 或 Aggregation) Operations需要缓存排序中间表和Hash Table,在执行计划真正运行之前,需要向系统申请一定数量的内存资源(Granted Memory),如果SQL Server 不能 allocate 申请的内存,那么该执行计划将不会执行,处于RESOURCE_SEMAPHORE 等待. Resource Semaphore: SQL Server uses a thread synchronization object ca

《modern operating system》 chapter 3 MEMORY MANAGEMENT 笔记

MEMORY MANAGEMENT The part of the operating system that manages (part of) the memory hierarchy is called thememory manager 这章感觉有点多...80 多页..看完都看了两天多,做笔记就更有点不想...有点懒了..但是要坚持下去,可以自己较劲 对于内存的抽象,最简单的抽象就是...没有抽象 和第一次看不一样,把summary放在最前面,对整个mamory management的

The Android ION memory allocator

Back in December 2011, LWN reviewed the list of Android kernel patches in the linux-next staging directory. The merging of these drivers, one of which is a memory allocator called PMEM, holds the promise that the mainline kernel release can one day b

ti8168平台的tiler memory

DM8168 DMM/TILER简介 1.概述 如图4-1,DMM定位在SDRAM控制器的前端,是所有initiator产生的内存存取的接口. 动态内存管理器DMM,是一个专门的管理模块,广义上说,包括内存存取的方方面面.比如: initiator索引化的优先级产生. 多区域SDRAM内存交织配置 块目标传输优化:tiling和子tiling 集中的低延迟页翻译:类似MMU 内存的动态管理表现为软件可配置,天性为运行时,由DMM操作的内存管理有4个方面: 添加基于Initiator的优先级到任何

使用缓存管理器,尽你之能力(Cache Me if You Can: Using the NT Cache Manager )

在pediy.com发了一篇译文,简单转载这里. 缓存管理器属于NT内存管理器紧密集成的软件组件,与虚拟内存系统集成文件系统缓存数据. 好处是物理内存的使用和文件缓存和系统运行程序在缓存管理器下达到均衡应用. 另一个使用缓存关键原因是文件可被标准文件系统接口存取,如read和write等.或通过内存管理器形成一个"内存映射"文件. 缓存管理器数据结构:下段描述文件系统和缓存管理器共享的数据结构. Buffer Control Bloxk (BCB) Most of the buffer