[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内核和它的内存分配子系统提供以下特性 ...
随机推荐
- 深入web的请求过程
一.深入web的请求过程 1.1.B/S网络架构概述 · 从前端到后端,都基于应用层协议HTTP来交互数据.一个请求就对应了一个操作,完成操作之后就断开了连接.基于这样的特点可以用来满足海量的用户的操 ...
- rsync + sersync 实现实时数据同步
一.环境: 主机1:youzhuan-bak centos 7.2 主机2:youzhuan-online centos 7.2 二.部署过程: youzhuan-bak : [root@ ...
- Burp插件开发——环境配置
最近打算开发个Burp插件,从网上各种地找资料学习.第一步就应该是环境配置,请见下文. (其实最重要的前提是你已经安装了Burp,否则下面的所有内容都是无稽之谈了. https://pan.baidu ...
- 关于Android8及以上版本自定义广播无法接收问题
高版本Android直接发送广播是无法接收的 e.g. sendBraodcast(intent); 需要在前面加上(前一个String为接收广播应用的项目地址,后一个为该广播类的地址) intent ...
- 虚拟机上的centos7链接不上网络: activation of network connection failed
报错: 重启网络也不行: 解决: 1.打开网络配置文件: $vi /etc/sysconfig/network-scripts/ifcfg-ens33 (可以参照这里的描述,找到这个文件https: ...
- Oracle数据安全解决方案(1)——透明数据加密TDE
Oracle数据安全解决方案(1)——透明数据加密TDE2009年09月23日 22:49:00 华仔爱技术 阅读数:7991原文地址: http://www.oracle.com/technolog ...
- VUE环境项目搭建以及简单的运行例子
1.打开cmd命令窗口,node-v和npm-v可以查看相应的安装版本信息. 2.使用一下命令全局安装vue-cli. 1)npm install -g vue-cli 2)如果使用淘宝镜像,则是 ...
- 动态的加载显示oracle警告日志文件内容
Last login: Fri Jan 25 00:37:47 2019 from oracle [root@oracle ~]# su - oracle [oracle@oracle ~]$ sql ...
- java----代码打包
打包 文件生成在out目录下 D:\IDEA代码\out\artifacts\IDEA_jar 注意打包好像只能打包src下面的代码 不在src目录下的一些文件,自己文件添加到打包好的目录下 可以选择 ...
- 一个Tomcat下部署两个,甚至多个项目
是的這是我粘過來的 Tomcat目录下的结构如图: 第一步:Tomcat默认空间webapps,中已经存在一个项目了,此时要增加一个项目运行可以将原本webapps目录copa一份, 改名为webap ...