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

#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. web 中 bbs 例子(多次递归)

    数据库设计:create table `header`(  // 父表  parent int not null, //父级  poster varchar(20) not null, //作者  p ...

  2. node开子线程模块--tagg2

    tagg2包同样具有tagg包的多线程功能,采用新的node-gyp命令进行编译,同时它跨平台支持,mac,linux,windows下都可以使用,对开发人员的api也更加友好.安装方法很简单,直接n ...

  3. C语言面向对象的简便方法

    都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发.业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能.由于C语言自身的限制,并不完善,只能将就用,聊胜于无, ...

  4. leetcode第六题 ZigZag Conversion (java)

    ZigZag Conversion The string "PAYPALISHIRING" is written in a zigzag pattern on a given nu ...

  5. scanf格式控制符

    格式控制 . %d %o %x %c %s %f %e 无%u格式.%g格式 . scanf("%3d%3d", &a, &b); 输入: //a=123,b=45 ...

  6. delphi xe5 android 开发数据访问手机端(二)

    界面就这样吧,继续...,先启动咱们上几片文章建立的手机服务端 导入webservices单元,file->new->other->webservices->选择 wsdlim ...

  7. Google DNS劫持背后的技术分析

    0×00 背景 最近世界真是越来越不太平了,尤其是对于大部分普通人而言.昨天又传来噩耗,根据网络监测公司BGPMon,Google的公开DNS服务器 IP 8.8.8.8被劫持到了委内瑞拉和巴西超过2 ...

  8. 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网

    首先说说无线上网有哪几种形式? WIFI, GPRS, CDMA 3G无线上网 1>wifi全称wireless fidelity,是当今使用最广的一种无线网络传输技术.实际上就是把有线网络信号 ...

  9. 【Earthquake, 2001 Open 】 0-1 分数规划

    71  奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛 ...

  10. ANDROID_MARS学习笔记_S04_007_从服务器获取微博数据时间线

    一.代码 1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...