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 ...
随机推荐
- php hook 之简单例子
<?php// 应用单例模式// 建立相应的 plugins 文件夹,并建立 .php 文件放在里面class plugin{ public $actions; public $fi ...
- JS分段上传文件(File)并使用MD5.js加密文件段用来后台校验
HTML <form method="POST" name="form1" action="/mupload/upload/" enc ...
- 定时生成bat命令
windows下,定时生成bat的名. at 14:54 cmd /c "echo net share D=d:\ > d:d.bat" ^对>转义.
- 跨线程操作UI控件
写程序的时候经常会遇到跨线程访问控件的问题,看到不少人去设置Control.CheckForIllegalCrossThreadCalls = false;这句话是告诉编译器不要对跨线程访问作检查,可 ...
- wpf:DataGrid使用
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" ...
- 实现目标文件与源码分开的makefile测试实验
uboot提供了两种编译策略,即可以将生成的目标文件与源码混在一起,也可以将生成的目标文件与源码分开.通过对uboot Makefile的分析,笔者编写了一个简单的实现这种功能的Makfile. 顶层 ...
- csu 10月 月赛 A 题
Welcome to CSU OnlineJudge Problem A: Small change Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 15 ...
- 【HDU 3810】 Magina (01背包,优先队列优化,并查集)
Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of ...
- 被忽视的eMMC——A1 SD Bench闪存测试
一直以来,大家对手机的配置方面都比较关注CPU和GPU的架构.频率.核心数等,却经常忽略了手机闪存的速度.实际上手机的闪存素质对手机日常操作的响应.载入速度同样起到举足轻重的影响,今天给大家介绍的则是 ...
- C#面向对象基础类与方法
C#是纯粹的面向对象编程语言,它真正体现了“一切皆为对象”的精神. 在C#中,即使是最基本的数据类型,如int,double,bool类型,都属于System.Object(Object为所有类型的基 ...