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


     

  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/riskyer/p/3359808.html
Copyright © 2011-2022 走看看