bupt复试机试----模拟部分

文章目录

内存分配

题目描述

在操作系统中,内存分配是非常重要的工作。
己知内存空间由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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值