2021北航计算机夏令营机试 T1 环形链表

题意:

  • 在操作系统中,空闲存储空间通常以空闲块链表方式组织,每个块包含块起始位置、块长度、指向下一块的指针。空闲块按照存储位置升序串联,最后一块指向第一块(构成循环链表)。
  • 当有空间申请请求时,按照如下原则在空闲块循环链表中寻找并分配空闲块:
    • 从当前位置开始遍历空闲块链表(初始位置是地址最小的第一个空闲块),寻找满足条件的最小块(即:大于等于请求空间的最小空闲块)。如果有多个大小相同的最小空闲块,则选择遍历遇到的第一个空闲块)(最佳适应原则);
    • 如果选择的空闲块恰好与请求的大小相符合,则将它从链表中移除并返回给用户;这时当前位置变为 移除空闲块的下一空闲块
    • 如果选择的空闲块大于所申请的空间大小,则将大小合适的空闲块返回给用户,剩下的部分留在空闲块链表中;这时 当前位置仍然为该空闲块
    • 如果找不到足够大的空闲块,则申请失败;这时当前位置不变。
  • 例如:下图示例给出了空闲块链表的初始状态,每个结点表示一个空闲块,结点中上面的数字指空闲块的起始位置,下面的数字指空闲块的长度,位置和长度都用正整数表示,大小不超过int表示范围。当前位置为最小地址为1024的空闲块。

输入样例:

12
1024 2048
8192 512
16384 1024
32768 8192
65536 8192
77824 1024
80896 3072
86016 1024
91136 5120
99328 512
104448 1024
112640 3072
1024 2560 10240 512 1024 6400 512 -1

输出样例:

104448 1024
112640 3072
1024 2048
8192 512
32768 1792
65536 8192
77824 1024
91136 5120

样例解释:

  • 初始链表如下:

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9+7;
int n; int a[110], b[110];
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=0; i<n; ++i) cin>>a[i]>>b[i];
// for(int i=0; i<n; ++i) cin>>b[i];
int cur=0, request; int cnt = 1;
while(1){
cin>>request;
if(request == -1){
for(int i=0; i<n; ++i)
if(b[(cur+i)%n]>0)
cout<<a[(cur+i)%n]<<" "<<b[(cur+i)%n]<<endl;
break;
}
int mini = MOD, take = -1;
for(int i=0; i<n; ++i){
if(b[(cur+i)%n]>=request){
if(mini>b[(cur+i)%n])
mini=b[(cur+i)%n], take=(cur+i)%n;
}
}
if(take!=-1) b[take]-=request, cur=take;
if(b[cur]==0) cur = (cur+1)%n;
++cnt;
}
}

本文作者:MoonOut

本文链接:https://www.cnblogs.com/moonout/p/16453614.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   MoonOut  阅读(188)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Sibelius: Violin Concerto in D Minor, Op. 47:III. Allegro, ma non tanto Jascha Heifetz / Chicago Symphony Orchestra
Sibelius: Violin Concerto in D Minor, Op. 47:III. Allegro, ma non tanto - Jascha Heifetz / Chicago Symphony Orchestra
00:00 / 00:00
An audio error has occurred.