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