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


 

 

posted on 2013-10-09 18:28  you Richer  阅读(435)  评论(0编辑  收藏  举报