Problem B. 內存分配
題目描述
在操作系統中,內存分配是非常重要的工作。
已知內存空間由N個內存塊組成,這些內存塊從1到N編號,進行內存分配時,操作系統將選擇一塊大小足夠的內存全部分配給請求內存的進程。例如,當進程請求10MB的內存時,操作系統必須向該進程分配一個不小於10MB的內存塊。內存塊不能被重複分配。
操作系統有三種基本的分配方式,分別爲:
首次適應:從1號到N號內存塊依次查找,直到找到第一塊足夠大的且未分配出去的內存塊,將其分配給進程。
最佳適應:找到當前未分配出去且大小足夠的內存塊中最小的內存塊分配給進程。
最差適應:找到當前未分配出去且大小足夠的內存塊中最大的內存塊分配給進程。
其中,最佳適應是應用最爲廣泛的分配方式。現在,操作系統要依次處理M個進程的內存請求,請按照最佳適應方式分配內存,並輸出相應分配到的內存塊的大小。如果沒有大小足夠的內存塊可以滿足當前請求,則輸出“NULL”(不包含引號),並跳出該請求。
輸入格式
輸入數據的第一行是測試數據組數T(T<=50)
每組數據由4行構成:
第一行爲一個整數N(1<=N<=100),表示有N個內存塊。
第二行有N個整數,第i個整數表示第i塊內存塊的大小。
第三行爲一個整數M(1<=M<=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
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXSIZE 120
using namespace std;
int main(){
int t,n,m;
int buf[MAXSIZE];
int applySize;
bool turnOn[MAXSIZE];
bool firstCase;
scanf("%d",&t);
while (t--){
//input && initiate
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d",&buf[i]);
turnOn[i]=false;
}
firstCase=true;
//sort
sort(buf,buf+n);
//debug****
// for (int i=0;i<n;i++){
// cout<<buf[i]<<' ';
// }
// return true;
//*********
//alloc
scanf("%d",&m);
for (int i=0;i<m;i++){//m times applications
int j;
scanf("%d",&applySize);
for (j=0;j<n;j++){//traverse the buf[]
if (turnOn[j]==false&&buf[j]>=applySize){//found &&output
if (firstCase==true)
firstCase=false;
else
printf(" ");
printf("%d",buf[j]);/*bug*/
turnOn[j]=true;
break;
}
}
if (j==n){//not find&&output
if (firstCase==true)
firstCase=false;
else
printf(" ");
printf("NULL");
}
}
printf("\n");
}
return true;
}