好麻烦的模拟题,一次性过了就好!!!不过用了两天哦。。 小伙伴们慢慢做哦。

#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 内存分配的更多相关文章

  1. 《深入理解Java虚拟机》内存分配策略

    上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...

  2. Java的内存分配

    java内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(方法区的内存中) 类加载时 方法信息保存在一块称为方法区的内存中, 并不随你创建对象而随对象保存于堆中; D:本地方法 ...

  3. C语言内存分配方法。

    当C程序运行在操作系统上时,操作系统会给每一个程序分配一定的栈空间. 堆为所有程序共有的,需要时需要申请访问. 一.栈 局部变量.函数一般在栈空间中. 运行时自动分配&自动回收:栈是自动管理的 ...

  4. JVM内存分配策略

    在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...

  5. Java的垃圾回收和内存分配策略

    本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...

  6. Buddy内存分配算法

    Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...

  7. 小白请教几个关于Java虚拟机内存分配策略的问题

    最近在看周志明所著的<深入理解Java虚拟机>,有几个问题不太明白,希望对虚拟机有研究的哥们儿帮我解答一下.先说一下我进行试验的环境: 操作系统:Mac OS X 10.11.6 EI C ...

  8. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  9. Linux内核笔记——内存管理之块内存分配

    内核版本:linux-2.6.11 伙伴系统 伙伴系统是linux用于满足对不同大小块物理内存分配和释放请求的解决方案. 内存管理区 linux将物理内存分成三个内存管理区,分别为ZONE_DMA Z ...

随机推荐

  1. jQuery 之 .stop() 方法

    总结version 1.7版本前.stop([clearQueue][,jumpToEnd])clearQueue: 布尔值,默认是 false;此值处理是相关的动画队列是否移除,如果为 false ...

  2. php学习,一个简单的Calendar(2) 一个简单的活动页面

    有了前面的基础,后面就是将页面展示出来. 预览图如下:1号和31号分别有活动,会一并显示出来   这里需要搞定几个问题,一个就是数据库的连接,我们用\sys\class\class.db_connec ...

  3. nginx 反向代理 odoo, 速度提升

    1: sudo apt-get  install nginx 2:  add server: 在/etc/nginx/sites-enabled 中增加一个可用的server. 文件如下图所示 3:重 ...

  4. C# 翻页设计:首页,上一页,下一页,末页 ,跳转

    int pageSize = 0; //每页显示行数 int nMax = 0; //总记录数 int pageCount = 0; //页数=总记录数/每页显示行数 int pageCurrent ...

  5. MVC + JQUERY + AJAX

  6. C#中的委托事件的分析

    推荐:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 委托和事件在 .NET Framework 中的应用非常广泛,然而, ...

  7. Java多线程初学者指南(9):为什么要进行数据同步

    Java中的变量分为两类:局部变量和类变量.局部变量是指在方法内定义的变量,如在run方法中定义的变量.对于这些变量来说,并不存在线程之间共享的问题.因此,它们不需要进行数据同步.类变量是在类中定义的 ...

  8. python中的__init__ 、__new__、__call__等内置函数的剖析

    1.__new__(cls, *args, **kwargs)   创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身2.__init__(self, *args, ...

  9. ABAP打开TCODE

    CALL FUNCTION 'TH_CREATE_MODE'  EXPORTING    transaktion    = 'ZGNBWD001'  EXCEPTIONS    max_session ...

  10. 【java并发】线程同步工具Semaphore的使用

    Semaphore通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,我们可以自己设定最大访问量.它有两个很常用的方法是acquire()和release(),分别是获得许可和释放许可.  官方J ...