内存分配
题目描述
在操作系统中,内存分配是非常重要的工作。
己知内存空间由N个内存块组成,这些内存块从1到N编号。
进行内存分配时,操作系统将选择一块大小足够的内存全部分配给请求内存的进程。例如,当进程请求10MB的内存时,操作系统必须向该进程分配一个不小于 10MB的内存块。内存块不能重复分配。
操作系统有三种基本的分配方式,分别为:
•首次适应:从1号到N号内存块依次査找,直到找到第一块足够大的且未分配出去的内存块,将其分配给进程。
•最佳适应:找到当前未分配出去且大小足够的内存块中最小的内存块分配给进程。
•最差适应:找到当前未分配出去且大小足够的内存块中最大的内存块分配给进程。
其中,最佳适应方式是应用最为广泛。现在,操作系统要依次处理M个进程的内存请求,请按照最佳适应方式分配内存,并输出相应的内存块的大小。如果,没有大小足够的内存块可以满足当前请求,则输出”NULL"(不包含引号〕,并跳过该请求。
输入
输入数据的第一行是测试数据组数T (T<=20)
每组数据由4行构成:
第一行为一个整数N(1~100),表示有N个内存块
第二行有N个整数,第i个整数表示第i块内存块的大小
第三行为一个整数M (1 ~ 100),表示有M个请求
第四行有M个整数,表示进程所请求的内存空间。
输出
每组数据输出一行,每行有M个数,表示操作系统采用最佳适应方式,依次分 配给进程的内存块大小;
如果没有讨用内存块,输出”NULL"(不包含引号〕
不要输出多余的行尾空格。
样例输入
2
4
7 5 10 3
2
4 6
4
3 5 9 10
3
5 12 6
样例输出
5 7
5 NULL 9
来源
2014机考B题
#include <iostream>
#include<bits/stdc++.h>
#define N 1000
using namespace std;
struct num{
int data;
bool visit;
};
bool cmp(num x,num y){
return x.data<y.data;
}
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
num no[N];
for(int i=0;i<n;i++){
cin>>no[i].data;
no[i].visit=false;
}
sort(no,no+n,cmp);
int m;
cin>>m;
int *op=new int[m];
for(int i=0;i<m;i++){
cin>>op[i];
}
int j;
for(int i=0;i<m;i++){
int flag=0;
for(j=0;j<n;j++){
//cout<<op[i]<<" "<<no[j].data<<" "<<no[j].visit<<endl;
if(op[i]<=no[j].data&&no[j].visit==false){
flag=1;
no[j].visit=true;
break;
}
}
if(flag==1)cout<<no[j].data<<" ";
else cout<<"NULL"<<" ";
}
cout<<endl;
}
return 0;
}
汇编
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int jinzhi(string a,int jin,int len){
int num=0;
for(int j=len-1,i=0;j>=0;j--){
if(jin==16&&a[j]>='A'&&a[j]<='Z'){
a[j]=a[j]-'A'+10;
}else{
a[j]=a[j]-'0';
}
num=num+(pow(jin,i++)*a[j]);
}
return num;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int s[4];
memset(s,0,sizeof(s));
string op;
int m;
scanf("%d",&m);
while(m--){
cin>>op;
string yu;
cin>>yu;
int pos=yu.find(',');
string a,b;
a=yu.substr(0,pos);
b=yu.substr(pos+1,yu.size()-pos);
int num;
if(b[0]>='0'&&b[0]<='9'){
int jin;
int len=b.size();
if(b[len-1]=='B'){
jin=2;
len--;
}else if(b[len-1]=='H'){
jin=16;
len--;
}else{
jin=10;
}
num=jinzhi(b,jin,len);
}else{
if(b[b.size()-1]=='X'){
num=s[b[0]-'A'];
}else if(b[b.size()-1]=='H'){
num=s[b[0]-'A']/256;
}else if(b[b.size()-1]=='L'){
num=s[b[0]-'A']%256;
}
}
//处理前面部分
if(op=="ADD"){
if(a[a.size()-1]=='X'){
s[a[0]-'A']+=num;
}else if(a[a.size()-1]=='H'){
int h=s[a[0]-'A']/256;
h+=num;
s[a[0]-'A']=s[a[0]-'A']%256+h*256;
}else if(a[a.size()-1]=='L'){
s[a[0]-'A']+=num;
}
}else if(op=="MOV"){
if(a[a.size()-1]=='X'){
s[a[0]-'A']=num;
}else if(a[a.size()-1]=='H'){
s[a[0]-'A']=s[a[0]-'A']%256+num*256;
}else if(a[a.size()-1]=='L'){
s[a[0]-'A']=s[a[0]-'A']/256*256+num;
}
}
}
for(int i=0;i<4;i++){
cout<<s[i]<<" ";
}cout<<endl;
}
return 0;
}