题目描述
当采用可变分区分配方案对1024KB的内存进行管理时,要求输入多个进程已经占用分区信息、一个进程内存请求以及所选用的分配算法,输出显示分配给进程的分区信息。
输入格式
程序要求输入4行,以回车符号作为分隔,第一行是一个整数n(4>n>0),表示进程已经占用分区的数量;第二行是2n个整数,依次按地址递增对应第一行n个进程已经占用分区的起始地址和存储容量(单位为KB)。第三行是三个整数,表示进程申请的内存空间大小(存储容量单位为KB);第四行是一个字符串,用”BEST”、 ”NEXT”、 ”WORST” (不含双引号,所有字母皆为大写)分别表示所选用的最佳适应、下次适应和最差适应分配算法。
输出格式
输出三个整数或字符串”false”(不含双引号,所有字母皆为小写),分别表示给进程所分配分区的起始地址;若某进程分配失败,则用”false”表示(不含双引号,所有字母皆为小写)。
输入样例 复制
1
50 100
20 20 80
BEST
输出样例 复制
0 20 150
#include <stdio.h>
int num = 0;
int idx = 0;
int A[10] ={0};
int B[] ={0,0,0,0,0,0,0,0,0,0};
int space[3] ={0};
void best(int len) {
int min = 1024;
int minQuality = 1024;
int isPos = 0;
for (int i = 0; i <= len; i++) {
if (B[i] < minQuality) {
if((space[num] <= B[i])==1){
min = i;
minQuality = B[i];
isPos = 1;
}
}
}
isPos != 0 ? printf("%d ", A[min]): printf("false ");
if(isPos!=0){A[min] += space[num];B[min] -= space[num];}
num++;
if (num != 3) {
best(len);
} else {
return;
}
if(!(num!=3)) return;
else best(len);
}
void next(int len) {
int i = idx;
do {
if (space[num] <= B[i]) {
idx = (i + 1) % (len + 1);
printf("%d ", A[i]);
A[i] =A[i] + space[num];
B[i] =B[i] - space[num];
num++;
break;
}
i = (i + 1) % (len + 1);
} while (i != idx);
if(!(num==3)){next(len);
}else{return;}
}
void worst(int len) {
int size = len + 1;
int max = -1;
int maxQuality = -1;
int isPos = 0;
int i =0;
while(i < size){
if (B[i] > maxQuality && space[num] <= B[i]) {
max = i;
maxQuality = B[i];
isPos = 1;
}
i++;
}
isPos!=0 ? printf("%d ", A[max]): printf("false ");
if(isPos!=0){A[max] =A[max] + space[num];
B[max] =B[max] - space[num];}
num++;
if(num!=3){
worst(len);
}else{return;}
}
int main() {
int n = 0 ;
scanf("%d", &n);
int array[n][2];
A[0] = 0;
for (int i = 0; i <= n-1; i++) {
scanf("%d %d", &array[i][0], &array[i][1]);
A[i + 1] = array[i][0] + array[i][1];
B[i] = array[i][0] - A[i];
if (i == (n - 1)) {
B[i + 1] = 1024 -A[i + 1];
}
}
for (int i = 0; i <= (2+5-5); i++) {
scanf("%d", &space[i]);
}
char way[5];
scanf("%s", way);
switch(way[0]){
case 'B':best(n);break;
case 'N':next(n);break;
case 'W':worst(n);
}
return 0;
}