[CodeForces7B]Memory Manager

Posted lyfoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CodeForces7B]Memory Manager相关的知识,希望对你有一定的参考价值。

Translate

这个内存条一共有连续的 (m) 个块。给你(n)个操作:

  • (alloc) (x),就是你要产生一个块,这个块的大小是(x)。前提是:存在一个连续区间可以放下这个块。那就放下去,而且要求尽量放在前面。如果不能放就输NULL。不然就输出一个数,从(1)开始。

  • (erase) (x),就是把编号为 (x) 的块擦除。非法擦除就输出ILLEGAL_ERASE_ARGUMENT

  • (defragment),就是重新排序,把每个块都尽量放在前面,让后面的都是空的。

思路

  • 难点1: 将(3)个操作整合在一起有点坑,实际上我们第几块对对应格子赋值为这个格子的编号就(OK)了。

  • 难点2: (alloc)稍微有点难,我们只需要让(i)(1)(m)找,一旦有空的就找有连续的有几个,够的话就进一步处理,否则将(i)赋值为中断的已用内存块。

  • 难点3: 整合方面应该是将编号越往前的越向前靠拢,而不是编号小的,(erase)给出的参数可能为非正数。

然后搞懂了上面的内容就很简单了,可以看代码注释。

Code

#include<bits/stdc++.h>
using namespace std;
int x,n,m;
int blocks=0;
int a[110];
char choice[11];
void alloc()
{
    for(int i=1;i<=m;i++)
    {
        int j=i;
        int num=0;
        while(a[j]==0 && num !=x && j<=m)//内存空间是空的,数量不超过x,不能超范围
        {
            num++;
            j++;
        }
        if(num!=x)//如果比x少
            i=j;
        else
        {
            blocks++;
            for(int k=i;k<j;k++)
                a[k]=blocks;
            cout<<blocks<<endl;
            return ;
        }

    }
    cout<<"NULL"<<endl;
}
void earse()
{
    if(x<=0)
    {
        cout<<"ILLEGAL_ERASE_ARGUMENT"<<endl;
        return ;
    }
    int flag=0;
    for(int i=1;i<=m;i++)
        while(a[i]==x)//如果符合这个快
        {
            a[i++]=0;
            flag=1;
        }
    if(flag!=1)//flag=1代表已经删除
        cout<<"ILLEGAL_ERASE_ARGUMENT"<<endl;
}
void defragment()
{
    for(int i=1;i<=m;i++)
        if(a[i]==0)//只有为空的状态下才可以放
            for(int j=i+1;j<=m;j++)//判断哪里有块移动过来
                if(a[j])//如果这里有块
                {
                    swap(a[i],a[j]);
                    break;
                }

}
int main()
{
    cin>>n>>m;
    memset(a,0,sizeof(a));
    while(n--)
    {
        cin>>choice;
        if(choice[0]=='a')
        {
            cin>>x;
            alloc();
        }
        else if(choice[0]=='e')
        {
            cin>>x;
            earse();
        }
        else if(choice[0]=='d')
            defragment();
    }
    return 0;
}

以上是关于[CodeForces7B]Memory Manager的主要内容,如果未能解决你的问题,请参考以下文章

您好,请问java中tostring方法如何输出对象数组??

是否可以在对 Where 的调用中调用命名方法?

how-to-add-a-breakpoint-in-a-managed-generic-method-in-windbg-sos

[Machine Learning for Trading] {ud501} Lesson 19: 02-09 The Fundamental Law of active portfolio mana

OUTPUT INSERTED Id/SCOPE_IDENTITY() 在 C# (ASP.NET Core Razor Pages) SQL 查询中返回 null,在 SQL Server Mana

谁能告诉我所有的符文名字与序号~还有作用