题意

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. js较深入的知识点

    浏览器渲染过程是怎样的?重绘重排是什么?如何避免过多的重绘重排? 将html解析为dom树; 将css解析为cssom; 结合DOM树和CSSOM树,生成一棵渲染树(Render Tree); 生成布 ...

  2. Could not find a package configuration file provided by "Qt5Widgets"

    解决: sudo apt install qttools5-dev

  3. gitlab 随笔

    输入: $ git init $ git add . $ git commit -m 'init commit' 绿色部分为gitlab网页的项目创建后下面的ssh路径,也可以通过查看gitlab网页 ...

  4. 帆软报表(finereport)实现自动滚屏效果

    例如Demo:IOS平台年度数据报表. 展示内容丰富,一个页面中存在多个图表.内容,超出了浏览器窗口的大小导致内容展示不全. 为了能够预览这个报表的全部内容,可以使用JS滚屏效果来实现. 操作步骤: ...

  5. C - BLG POJ - 1417 种类并查集加dp(背包)

    思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...

  6. VUE环境项目搭建以及简单的运行例子

    1.打开cmd命令窗口,node-v和npm-v可以查看相应的安装版本信息. 2.使用一下命令全局安装vue-cli. 1)npm install  -g  vue-cli 2)如果使用淘宝镜像,则是 ...

  7. 有名的素MM

    from math import sqrt item=[] for yr in [1988,1989]: for mth in range(1,13): if mth in [1,3,5,7,8,10 ...

  8. spring-cloud-ribbon负载均衡组件

    Ribbon简介: Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现. 通过 Spring Cloud 的封装 ...

  9. spring-mybatis的整合

    1.导入包 2.创建一个请求文件发送请求 <%@ page language="java" contentType="text/html; charset=UTF- ...

  10. 使用Jenkins时,如果GIT_COMMIT无变化,跳过构建

    使用Jenkins时,如果GIT_COMMIT无变化,跳过构建    使用插件: conditional-buildstep A buildstep wrapping any number of ot ...