poj 1193 内存分配
好麻烦的模拟题,一次性过了就好!!!不过用了两天哦。。 小伙伴们慢慢做哦。
#include <iostream>
#include <list>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int a[10005],b[10005],c[10005],t=0,wt=0,m=0;
struct point
{
int s,e,t;
bool operator <(const point &a) const {
return a.t<t;
}
}p;
struct point1{
int t,m,p;
}p1;
priority_queue <point> ing; //进行的队列
list <point> L; //空闲空间
list <point1> wait; //等待队列
int min(int x,int y)
{
if(x<y) return x; else return y;
}
void f(int tt) // 等待队列进入进行队列
{
int i,j;
list <point> ::iterator it,it1;
list <point1> ::iterator it2=wait.begin();
int kk=0,flag=0;
if(!wait.empty())
for(j=0,it2;it2!=wait.end()&&tt>=(*it2).t;it2++,j++)
{
int flag1=0;
for(it=L.begin();it!=L.end();it++)
if((*it).e-(*it).s+1>(*it2).m)
{
p.s=(*it).s,p.e=(*it).s+(*it2).m-1;p.t=tt+(*it2).p;ing.push(p);
(*it).s=(*it).s+(*it2).m;d[kk++]=j;flag1=1;break;
}
else if((*it).e-(*it).s+1==(*it2).m)
{ p.s=(*it).s,p.e=(*it).s+(*it2).m-1;p.t=tt+(*it2).p;ing.push(p);
d[kk++]=j; L.erase(it);flag1=1;break;}
if(flag1==0) break;
}
for(i=0;i<kk;i++)
{list <point1> ::iterator it3=wait.begin();
for(j=0;j<d[i]-flag;j++) it3++;
wait.erase(it3),flag++;
}
} void inserting() //插入当前进程
{
int flag=0;
list <point> ::iterator it;
for(it=L.begin();it!=L.end();it++)
{
if((*it).e-(*it).s+1>b[t])
{p.s=(*it).s,p.e=(*it).s+b[t]-1;p.t=a[t]+c[t];ing.push(p);
(*it).s=(*it).s+b[t];flag=1; break;}
else
if((*it).e-(*it).s+1==b[t])
{p.s=(*it).s,p.e=(*it).s+b[t]-1;p.t=a[t]+c[t];ing.push(p);
L.erase(it);flag=1; break;}
}
if(flag==0)
{
wt++; p1.t=a[t],p1.m=b[t],p1.p=c[t];
wait.push_back(p1);
}
}
void Ing() //正在进行的进程释放空间
{
int flag,kk,k,k1;
while(!ing.empty())
{ flag=0; if(t<m) k=a[t]; else k=ing.top().t;
if(ing.top().t<=k)
{ list <point> ::iterator it,it1; kk=ing.top().t;
for(it1=it=L.begin();it!=L.end();it++)
if(ing.top().e<(*it).s) {
if(ing.top().e+1==(*it).s) {(*it).s=ing.top().s;if((*it1).e+1==(*it).s) (*it).s=(*it1).s,L.erase(it1);}
else if((*it1).e+1==ing.top().s)
(*it1).e=ing.top().e;
else { L.insert(it,ing.top());}
ing.pop(); flag=1;
break;
}
else it1=it;
if(flag==0&&it==L.end())
{if(it1!=it&&(*it1).e+1==ing.top().s) (*it1).e=ing.top().e;
else L.push_back(ing.top());ing.pop(); }
}
else break;
if(!ing.empty()) {if(kk!=ing.top().t) f(kk);} else f(kk);
if(t==m) { if(!ing.empty()) {if(kk!=ing.top().t) f(kk);break;} else {f(kk);break;}}
}
}
int main(int argc, char *argv[])
{
int i,j,k,sum,n,pp=0;
cin>>n;
while(1)
{
scanf("%d%d%d",&a[m],&b[m],&c[m]); if(a[m]+b[m]+c[m]==0) break; else {if(c[m]==0) c[m]=1; m++;}
}
p.s=0,p.e=n-1; L.push_back(p);
while(1)
{
if(t<m)
{
Ing(); inserting();
t++;
list <point> ::iterator it,it1;
}
else if(!wait.empty())
{
Ing();
list <point> ::iterator it,it1;
}
else break;
}
while(!ing.empty()) {sum=ing.top().t;ing.pop();}
cout<<sum<<endl<<wt<<endl;
system("pause");
return 0;
}
poj 1193 内存分配的更多相关文章
- 《深入理解Java虚拟机》内存分配策略
上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...
- Java的内存分配
java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...
- C语言内存分配方法。
当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...
- JVM内存分配策略
在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...
- Java的垃圾回收和内存分配策略
本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...
- Buddy内存分配算法
Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...
- 小白请教几个关于Java虚拟机内存分配策略的问题
最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI C ...
- Linux内核笔记--内存管理之用户态进程内存分配
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
- Linux内核笔记——内存管理之块内存分配
内核版本:linux-2.6.11 伙伴系统 伙伴系统是linux用于满足对不同大小块物理内存分配和释放请求的解决方案. 内存管理区 linux将物理内存分成三个内存管理区,分别为ZONE_DMA Z ...
随机推荐
- jquery ajax 的data 存表单的值
jsp <body> <form action="" method="post" id="formid"> < ...
- 【转】EXT JS MVC开发模式
原文链接:EXT JS MVC开发模式 在app(亦即根目录)文件夹下面创建controller.model.store和view文件夹,从名称上就知道他们该放置什么代码了吧.然后创建Applicat ...
- js 中对象属性特性2
对象的存储描述: get 和 set 方法 <script> var obj ={ get age(){ return 22 }, set age(value){ console. ...
- Keil的c语言编译器
我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...
- android中LayoutInflater详解与使用
android的LayoutInflater用来得到一个布局文件,也就是xxx.xml,而我们常用的findviewbyid是用来取得布局文件里的控件或都布局.inflater即为填充的意思,也就是说 ...
- Coding.net代码托管平台建立WordPress
Coding.net这是一个国内新兴的代码托管平台,功能主要包括:代码托管.在线运行环境.监控代码质量,兼有一定的社交功能,在线运行环境支持Java.Ruby.Node.js.PHP.Python.G ...
- mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用
添加的作用是:指定字符的编码.解码格式. 例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码.这时候如果添加了useUnicode=true&cha ...
- USB数据线上的“疙瘩”:原来有这么大用处!
在不少键盘.鼠标或是游戏外设的数据线末端我们都能见到一小段金属圆环.虽然这算得上是习以为常的一个设计,但如果说到其具体作用的话很多人一下子还真回答不上来.反正笔者在这里先可以告诉大家,这货肯定不是简简 ...
- 【Xamarin开发 Android 系列 2】VS2015跨平台开发的几种方式
原文:[Xamarin开发 Android 系列 2]VS2015跨平台开发的几种方式 在微软Build大会上,微软宣布在VS2015中支持三种方式进行跨平台的开发. 1. Xamarin 2. Co ...
- Android开源项目发现---ImageView 篇(持续更新)
1. PhotoView 支持双击或双指缩放的ImageView 在ViewPager等Scrolling view中正常使用,相比上面的AndroidTouchGallery,不仅支持ViewPag ...