题意

T

内存占用情况

进程事件

0

1

2

3

4

5

6

7

8

9

进程A申请空间(M=3, P=10)<成功>

1

A

2

A

B

进程B申请空间(M=4, P=3)<成功>

3

A

B

进程C申请空间(M=4, P=4)<失败进入等待队列>

4

A

B

D

进程D申请空间(M=1, P=4)<成功>

5

A

C

D

进程B结束,释放空间

进程C从等待队列取出,分配空间

进程E申请空间(M=3, P=4)<失败进入等待队列>

6

A

C

D

7

A

C

D

8

A

C

E

进程D结束,释放空间

进程E从等待队列取出,分配空间

9

A

E

进程C结束,释放空间

10

A

E

11

E

进程A结束,释放空间

12

进程E结束,释放空间

具体题目看http://poj.org/problem?id=1193 是中文的

思路

自己一开始想暴力模拟,单身很难实现

后来“抄”了std的代码,用的是链表+二叉堆(有吗?)

代码

//author: sysky
//copy: XuHt
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#define INF 0x3fffffff
using namespace std;
int n,w=INF,cnt=;
struct data{
int t,m,p,s;
bool operator <(const data x)
const{
return s<x.s;
}
}x;
vector<data> p;
queue<data> q;
bool work_in(int t) {
if (p.empty() || p[].s >= x.m) {
x.s = ;
x.t = t;
p.push_back(x);
sort(p.begin(), p.end());
return ;
}
for (unsigned int i = ; i < p.size(); i++)
if (p[i].s - (p[i-].s + p[i-].m) >= x.m) {
x.s = p[i-].s + p[i-].m;
x.t = t;
p.push_back(x);
sort(p.begin(), p.end());
return ;
}
int sz = p.size();
if (n - (p[sz-].s + p[sz-].m) >= x.m) {
x.s = p[sz-].s + p[sz-].m;
x.t = t;
p.push_back(x);
sort(p.begin(), p.end());
return ;
}
return ;
}
void work_out() {
int nw = INF;
for (unsigned int i = ; i < p.size(); i++)
if (p[i].t + p[i].p == w) p.erase(p.begin() + i--);
else nw = min(nw, p[i].t + p[i].p);
while (q.size()) {
x = q.front();
if (work_in(w)) {
nw = min(nw, q.front().t + q.front().p);
q.pop();
cnt++;
} else break;
}
w = nw;
}
void work(int t, int m, int p) {
while (t >= w) work_out();
x.t = t;
x.m = m;
x.p = p;
if (work_in(t)) w = min(w, t + p);
else q.push(x);
}
int main()
{
scanf("%d",&n);
int t0,m0,p0;
while(scanf("%d%d%d",&t0,&m0,&p0)== &&!(t0==&&m0==&&p0==))
work(t0,m0,p0);
while(q.size()) work_out();
int ans=w;
for(int i=;i<p.size();i++)
ans=max(ans,p[i].t+p[i].p);
printf("%d\n%d\n",ans,cnt);
return ;
}

我太菜了

[POJ1193][NOI1999]内存分配(链表+模拟)的更多相关文章

  1. [BZOJ 3117] [NOI1999]内存分配(STL)

    [BZOJ 3117] [NOI1999]内存分配(STL) 题面 内存是计算机重要的资源之一,程序运行的过程中必须对内存进行分配. 经典的内存分配过程是这样进行的: 1.内存以内存单元为基本单位,每 ...

  2. poj1193 内存分配

    气死我了...这个毒瘤内存分配..... 优先队列 + 链表模拟,看起来搞一搞就好了却WA来WA去... 最后对拍手动找才发现错误: erase的时候不要急急忙忙插入wait!要把同一时期的erase ...

  3. 郑州尚学堂:链表的C语言如何实现动态内存分配

    一.为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组.比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数 ...

  4. 【C/C++】动态内存分配和链表

    本文对链表以及C/C++中的动态链表做详细诠释. 什么是链表? 链表是一种重要的数据结构,它最大的优点是可以进行动态的存储分配.链表有单向链表,双向链表,循环链表.对于c,这里我们只讨论单向链表. 我 ...

  5. c 链表和动态内存分配

    兜兜转转又用到了c.c的一些基本却忘记的差不多了(笑哭)!! 动态内存分配 当malloc完将返回的指针类型强制转换成想要的类型后,指针中存有该指针的数据结构,而分配的内存恰好可用于该数据结构. 链表 ...

  6. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  7. 模拟linux的内存分配与回收

    模拟linux的内存分配与回收 要求 通过深入理解内存分配管理的三种算法,定义相应的数据结构,编写具体代码. 充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣. (1)掌握内存分配FF,BF ...

  8. 20140506 visio 画布大小 栈实现队列 堆空闲内存地址链表 堆最大可分配的内存 可用内存链表

    1.调整visio的画布大小 按住Ctrl鼠标移动到画布边缘即可 2.两个栈实现一个队列 一个栈用于入队,一个用于出队 #include<iostream> #include<sta ...

  9. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

随机推荐

  1. Exp5 MSF基础应用 20164314

    一.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,如ms08_067; (成功) 2.一个针对浏览器的攻击,如ms1 ...

  2. BUAA-OO-表达式解析与求导

    BUAA-OO-表达式解析与求导 解析 按照常规,解析这一部分我们分为词法分析与语法分析.当然由于待解析的字符串较简单,词法分析器和语法分析器不必单独实现. 词法分析器 按照常规,我们先手写一个词法分 ...

  3. 在web项目启动时,执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  4. Elemant-UI日期范围的表单验证

    Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可.但是官网的示例只有普通日期类型的验证,没有时间 ...

  5. php json数据 入库时 转义字符丢失

    转义字符入库后消失,导致出库后无法反转义 解决办法  增加 addslashes函数 if (empty($result)) { $data['activitiesid'] = $param['act ...

  6. kettle使用记录

    1.linux系统抽取数据 export KETTLE_HOME=/home/oracle/Kettle/pdi-ce-6.1.0.1-196/data-integration export JAVA ...

  7. 【译】索引进阶(十一):SQL SERVER中的索引碎片【上篇】

    原文链接:传送门. 第十章节我们分析了索引的内部结构.有了这些关于索引结构的知识,我们便可以分析索引碎片了:其产生的原因,如何防止,以及何时可以不去关注它们. 一些背景知识 / 复习 以下知识对于理解 ...

  8. linux下双网卡双网关配置

    要求: eth0:192.168.100.203 连接内网,网关为192.168.100.1.需要和192.168.10.0.192.168.12.0.192.168.100.0.10.2.2.0.1 ...

  9. input子系统学习笔记六 按键驱动实例分析下【转】

    转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...

  10. HTTP协议详解(四)

    接着第三篇继续学习.... 9 Cookie和Session的比较 Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. S ...