zoukankan      html  css  js  c++  java
  • 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;
    }
    
    


     

  • 相关阅读:
    python3 bytes数据类型探讨
    字典
    列表及元组
    在py文件中设置文件头
    函数的作用域、global与nonlocal
    python中 的意义及用法
    int、bool和str
    while循环、格式化输出、运算符和编码初识
    python初认识、基础数据类型以及 if 流程控制
    列表遍历和生成器遍历效率对比
  • 原文地址:https://www.cnblogs.com/riskyer/p/3359808.html
Copyright © 2011-2022 走看看