思路:慢慢读完题,真的不难
#include<bits/stdc++.h>
using namespace std;
int a[12];//保存内存块,第i个表示2的i次方
int b[12];
int main()
{
std::ios::sync_with_stdio(false);
memset(a,0,11);
long long int k;
scanf("%lld",&k);//c语言中的long long int竟然这样输入,一直用的c++,抽空补一下子
char s[10];
long long int num;
while(k--)
{
scanf("%s %lld",&s,&num);
if(strcmp(s,"free")==0)
{
memset(b,0,11);
int n=0;//模2的位数
while(num)
{
b[n]=num%2;
num=num/2;
n++;
}
for(int i=0; i<n; i++)
a[i]+=b[i];
for(int i=0; i<11; i++)
{
if(i==10)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
}
else if(strcmp("allocate",s)==0)
{
int i=0;
int u=-1;
long long int s2=0;
//先找出比num大于等于2的幂,再从这开始往后找
while(s2<num)
{
s2=1;
for(int j=0; j<i; j++)
s2*=2;
if(s2>=num)
{
u=i;
break;
}
else
i++;
}
int flag=0;
for(int p=u; p<11; p++)//从u开始往后找,如果这时的内存块不为0,则该块减1,再分配剩余的(根据题中的例子来就好了)
{
if(a[p])
{
a[p]--;
s2=1;
for(int j=0; j<p; j++)
s2*=2;
int q=s2-num;
if(q)
{
memset(b,0,11);
int n=0;//模2的位数
while(q)
{
b[n]=q%2;
q=q/2;
n++;
}
for(int r=0; r<n; r++)
a[r]+=b[r];
}
flag=1;//寻找成功
break;
}
}
if(flag==1)
{
for(int r=0; r<11; r++)
{
if(r==10)
printf("%d\n",a[r]);
else
printf("%d ",a[r]);
}
}
else
printf("ERROR!\n");//注意换行,当时没换行,还纳闷了很久
}
}
return 0;
}