poj 1193 内存分配

时间:2022-01-28 12:46:22

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

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