标签:大小 擦除 ase i++ 否则 def 不能 个数 进一步
\(alloc\) \(x\),就是你要产生一个块,这个块的大小是\(x\)。前提是:存在一个连续区间可以放下这个块。那就放下去,而且要求尽量放在前面。如果不能放就输NULL
。不然就输出一个数,从\(1\)开始。
\(erase\) \(x\),就是把编号为 \(x\) 的块擦除。非法擦除就输出ILLEGAL_ERASE_ARGUMENT
。
\(defragment\),就是重新排序,把每个块都尽量放在前面,让后面的都是空的。
难点1: 将\(3\)个操作整合在一起有点坑,实际上我们第几块对对应格子赋值为这个格子的编号就\(OK\)了。
难点2: \(alloc\)稍微有点难,我们只需要让\(i\)从\(1\)道\(m\)找,一旦有空的就找有连续的有几个,够的话就进一步处理,否则将\(i\)赋值为中断的已用内存块。
难点3: 整合方面应该是将编号越往前的越向前靠拢,而不是编号小的,\(erase\)给出的参数可能为非正数。
然后搞懂了上面的内容就很简单了,可以看代码注释。
#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;
}
标签:大小 擦除 ase i++ 否则 def 不能 个数 进一步
原文地址:https://www.cnblogs.com/lyfoi/p/LiyifengCF7B.html