[POJ1193][NOI1999]内存分配(链表+模拟)

题意
|
时 刻 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]内存分配(链表+模拟)的更多相关文章
- [BZOJ 3117] [NOI1999]内存分配(STL)
[BZOJ 3117] [NOI1999]内存分配(STL) 题面 内存是计算机重要的资源之一,程序运行的过程中必须对内存进行分配. 经典的内存分配过程是这样进行的: 1.内存以内存单元为基本单位,每 ...
- poj1193 内存分配
气死我了...这个毒瘤内存分配..... 优先队列 + 链表模拟,看起来搞一搞就好了却WA来WA去... 最后对拍手动找才发现错误: erase的时候不要急急忙忙插入wait!要把同一时期的erase ...
- 郑州尚学堂:链表的C语言如何实现动态内存分配
一.为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组.比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数 ...
- 【C/C++】动态内存分配和链表
本文对链表以及C/C++中的动态链表做详细诠释. 什么是链表? 链表是一种重要的数据结构,它最大的优点是可以进行动态的存储分配.链表有单向链表,双向链表,循环链表.对于c,这里我们只讨论单向链表. 我 ...
- c 链表和动态内存分配
兜兜转转又用到了c.c的一些基本却忘记的差不多了(笑哭)!! 动态内存分配 当malloc完将返回的指针类型强制转换成想要的类型后,指针中存有该指针的数据结构,而分配的内存恰好可用于该数据结构. 链表 ...
- c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
#include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...
- 模拟linux的内存分配与回收
模拟linux的内存分配与回收 要求 通过深入理解内存分配管理的三种算法,定义相应的数据结构,编写具体代码. 充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣. (1)掌握内存分配FF,BF ...
- 20140506 visio 画布大小 栈实现队列 堆空闲内存地址链表 堆最大可分配的内存 可用内存链表
1.调整visio的画布大小 按住Ctrl鼠标移动到画布边缘即可 2.两个栈实现一个队列 一个栈用于入队,一个用于出队 #include<iostream> #include<sta ...
- SQLite剖析之动态内存分配
SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性 SQLite内核和它的内存分配子系统提供以下特性 ...
随机推荐
- js较深入的知识点
浏览器渲染过程是怎样的?重绘重排是什么?如何避免过多的重绘重排? 将html解析为dom树; 将css解析为cssom; 结合DOM树和CSSOM树,生成一棵渲染树(Render Tree); 生成布 ...
- Could not find a package configuration file provided by "Qt5Widgets"
解决: sudo apt install qttools5-dev
- gitlab 随笔
输入: $ git init $ git add . $ git commit -m 'init commit' 绿色部分为gitlab网页的项目创建后下面的ssh路径,也可以通过查看gitlab网页 ...
- 帆软报表(finereport)实现自动滚屏效果
例如Demo:IOS平台年度数据报表. 展示内容丰富,一个页面中存在多个图表.内容,超出了浏览器窗口的大小导致内容展示不全. 为了能够预览这个报表的全部内容,可以使用JS滚屏效果来实现. 操作步骤: ...
- C - BLG POJ - 1417 种类并查集加dp(背包)
思路:刚看这道题感觉什么都不清楚,人物之间的关系一点也看不出来,都不知道怎么写,连并查集都没看出来,但是你可以仔细分析一下,当输入字符串为“yes”的时候,我们设输入的值为x和y,当x为天使是则由题可 ...
- VUE环境项目搭建以及简单的运行例子
1.打开cmd命令窗口,node-v和npm-v可以查看相应的安装版本信息. 2.使用一下命令全局安装vue-cli. 1)npm install -g vue-cli 2)如果使用淘宝镜像,则是 ...
- 有名的素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 ...
- spring-cloud-ribbon负载均衡组件
Ribbon简介: Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现. 通过 Spring Cloud 的封装 ...
- spring-mybatis的整合
1.导入包 2.创建一个请求文件发送请求 <%@ page language="java" contentType="text/html; charset=UTF- ...
- 使用Jenkins时,如果GIT_COMMIT无变化,跳过构建
使用Jenkins时,如果GIT_COMMIT无变化,跳过构建 使用插件: conditional-buildstep A buildstep wrapping any number of ot ...