码迷,mamicode.com
首页 > 其他好文 > 详细

[CodeForces7B]Memory Manager

时间:2018-06-30 16:24:07      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:大小   擦除   ase   i++   否则   def   不能   个数   进一步   

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

标签:大小   擦除   ase   i++   否则   def   不能   个数   进一步   

原文地址:https://www.cnblogs.com/lyfoi/p/LiyifengCF7B.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!