[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方法如何输出对象数组??
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