1193:内存分配
总时间限制: 1000ms 内存限制: 65536kB
描述
内存是计算机重要的资源之一,程序运行的过程中必须对内存进行分配。
经典的内存分配过程是这样进行的:

  1. 内存以内存单元为基本单位,每个内存单元用一个固定的整数作为标识,称为地址。地址从0开始连续排列,地址相邻的内存单元被认为是逻辑上连续的。我们把从地址i开始的s个连续的内存单元称为首地址为i长度为s的地址片。
  2. 运行过程中有若干进程需要占用内存,对于每个进程有一个申请时刻T,需要内存单元数M及运行时间P。在运行时间P内(即T时刻开始,T+P时刻结束),这M个被占用的内存单元不能再被其他进程使用。
    3、假设在T时刻有一个进程申请M个单元,且运行时间为P,则:
  3. 若T时刻内存中存在长度为M的空闲地址片,则系统将这M个空闲单元分配给该进程。若存在多个长度为M个空闲地址片,则系统将首地址最小的那个空闲地址片分配给该进程。
  4. 如果T时刻不存在长度为M的空闲地址片,则该进程被放入一个等待队列。对于处于等待队列队头的进程,只要在任一时刻,存在长度为M的空闲地址片,系统马上将该进程取出队列,并为它分配内存单元。注意,在进行内存分配处理过程中,处于等待队列队头的进程的处理优先级最高,队列中的其它进程不能先于队头进程被处理。
    现在给出一系列描述进程的数据,请编写一程序模拟系统分配内存的过程。

输入
第一行是一个数N,表示总内存单元数(即地址范围从0到N-1)。从第二行开始每行描述一个进程的三个整数T、M、P(M <= N)。最后一行用三个0表示结束。
数据已按T从小到大排序。
输入文件最多10000行,且所有数据都小于109。
输入文件中同一行相邻两项之间用一个或多个空格隔开。
输出
包括2行。
第一行是全部进程都运行完毕的时刻。
第二行是被放入过等待队列的进程总数。
样例输入
10
1 3 10
2 4 3
3 4 4
4 1 4
5 3 4
0 0 0
样例输出
12
2
提示

来源
Noi 99

问题链接:Bailian1193 内存分配
问题简述:(略)
问题分析:(略)
程序说明:解题代码来自仙客传奇团队。
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

#include <iostream>
#include <cstdio>
#include <queue>
#define il inline
#define ri register
#define Size 15000
using namespace std;
template<class free>
struct heap{free a[Size];int n;il void push(free x){a[++n]=x;ri int p(n);while(p>1)if(a[p]<a[p>>1])swap(a[p],a[p>>1]),p>>=1;else break;}il void pop(){a[1]=a[n--];ri int p(1),s(2);while(s<=n){if(s<n&&a[s+1]<a[s])++s;if(a[s]<a[p])swap(a[s],a[p]),p=s,s<<=1;else break;}}
};
template<class free>
struct list{struct iter{iter*pre,*next;free v;}*head,*tail,*lt;il void initialize(){head=new iter(),tail=new iter();head->next=tail,tail->pre=head;}il void insert(iter *p,free x){lt=new iter{p->pre,p,x};p->pre->next=lt,p->pre=lt;}il void erase(iter *p){p->next->pre=p->pre;p->pre->next=p->next;delete p;}il void recycle(){while(head!=tail)head=head->next,delete head->pre;delete tail;}
};
struct Wait{int m,p;
};
struct mem{int l,r;bool used;
};
struct take{int t;list<mem>::iter *p;il bool operator<(const take&x)const{return t<x.t;}
};
int tim;
queue<Wait>D;
list<mem>L;heap<take>H;
int t,m,p;
il bool give(int,int);
il void read(int&),release();
int main(){L.initialize();int n,ans(0);read(n),L.insert(L.tail,{0,n-1});while(read(t),read(m),read(p),t||m||p){while(H.a[1].t<t&&H.n){tim=H.a[1].t+1,release();if(H.n&&H.a[1].t+1==tim)continue;while(D.size())if(give(D.front().m,D.front().p))D.pop();else break;}tim=t;if(!give(m,p))D.push({m,p}),++ans;}while(H.n){tim=H.a[1].t+1,release();if(H.n&&H.a[1].t+1==tim)continue;while(D.size())if(give(D.front().m,D.front().p))D.pop();else break;}printf("%d\n%d",tim,ans),L.recycle();return 0;
}
il void release(){if(!H.n)return;list<mem>::iter *i(H.a[1].p);if(i->pre!=L.head&&!i->pre->v.used)i->v.l=i->pre->v.l,L.erase(i->pre);if(i->next!=L.tail&&!i->next->v.used)i->v.r=i->next->v.r,L.erase(i->next);i->v.used=0,H.pop();
}
il bool give(int m,int p){list<mem>::iter *i;for(i=L.head->next;i!=L.tail;i=i->next)if(!i->v.used&&i->v.r-i->v.l+1>=m){int mid(i->v.l+m-1);if(mid<i->v.r)L.insert(i->next,{mid+1,i->v.r,0}),i->v.r=mid;i->v.used=1,H.push({tim+p-1,i});return true;}return false;
}
il void read(int &x){x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

Bailian1193 内存分配【数据结构】相关推荐

  1. 【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装

    [送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. ...

  2. openssl内存分配,查看内存泄露

    openssl内存分配  用户在使用内存时,容易犯的错误就是内存泄露.当用户调用内存分配和释放函数时,查找内存泄露比较麻烦.openssl提供了内置的内存分配/释放函数.如果用户完全调用openssl ...

  3. keilcjson内存分配失败_iOS标准库中常用数据结构和算法之内存池

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Linux编程点击右侧关注,免费入门到精通! 作者丨欧阳大哥2013https://www.jianshu.com ...

  4. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  5. 栈与堆的区别(内存分配与数据结构)

    参考自https://blog.csdn.net/K346K346/article/details/80849966/ 堆(Heap)与栈(Stack)包含两层含义: 程序内存布局场景下的内存管理方式 ...

  6. c语言紧凑算法的内存分配,C语言(第二章.1)算法与数据结构A.ppt

    C语言课件(第二章.1)算法与数据结构A资料 课程设置目的 本课程是非计算机专业学生的技术基础课,通过本课程的学习,应使学生掌握传统的结构化程序设计的一般方法,以C为语言基础,培养学生严谨的程序设计思 ...

  7. C语言的变量的内存分配

    今晚看了人家写的一个关于C语言内存分配的帖子,发现真是自己想找的,于是乎就收藏了... 先看一下两段代码: char* toStr() {char *s = "abcdefghijkl&qu ...

  8. Linux创建线程时 内存分配的那些事

    文章目录 问题描述 问题分析 针对问题1 的猜测: 针对问题2 的猜测: 原理追踪 总结 问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况. 分析结果时发现一个有趣 ...

  9. 栈区和堆区内存分配区别

    一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上 ...

最新文章

  1. 如何为某些HTML标记存储任意数据
  2. java 11-7String类里的方法的一些案例
  3. mysql压力测试工具Mysqlslap
  4. what do we lack as a student?
  5. SQL注入到EXP编写
  6. Nmap参数--指纹识别探测
  7. 初学 C 语言没有项目练手?这 20 个小项目拿走不谢~
  8. matlab怎么重新打开新的代码,方程求解程序代码求助-程序代码修改或新的代码...
  9. apache部署多个项目
  10. Android开发环境搭建(eclipse)
  11. sublime text3 Package Control 插件安装及推荐(MAC)
  12. 系统学习机器学习之神经网络(十一) --TDNN
  13. 【SimpleITK】分割结果融合策略
  14. 关于 IBM Tivoli Storage Manager在Oracle中的应用
  15. 量子力学随机矩阵理论
  16. 小学信息技术计算机教学反思,小学信息技术教学反思
  17. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩
  18. 天津专升本往届生学信网学历证书电子注册备案表查询下载操作步骤
  19. “灵”是我的眼 | 扫地机器人的智能化进阶之路
  20. Firebase国内替代方案

热门文章

  1. 安笙机器人_张翰新戏搭档徐璐!包贝尔要和辛芷蕾演奇幻电影?
  2. Vue——知识体系总结
  3. Cocos Creator 编辑器扩展
  4. 微服务动态路由实现:OpenResty+K8s
  5. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...
  6. linux登录vnc的命令行,用VNC远程登陆linux (ZT)
  7. git回退历史版本无法上传_Git实用教程(四) | Git本地库操作(查看提交历史、版本前进回退)...
  8. java hibernate的使用_java – 使用hibernate / JPA登录
  9. MIPS之u-boot流程分析
  10. Tableau可视化学习笔记:day07-08