首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

poj 1193 内存储器分配

2013-10-10 
poj 1193 内存分配好麻烦的模拟题,一次性过了就好!!!不过用了两天哦。。 小伙伴们慢慢做哦。#include iostre

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;}


 

热点排行