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