時spa 刻code Tblog |
內存佔用狀況隊列 |
進程事件進程 |
|||||||||||
0事件 |
1內存 |
2ci |
3it |
4io |
5 |
6 |
7 |
8 |
9 |
進程A申請空間(M=3, P=10)<成功> |
|||
1 |
A |
|
|
|
|
|
|
|
|||||
2 |
A |
B |
|
|
|
進程B申請空間(M=4, P=3)<成功> |
|||||||
3 |
A |
B |
|
|
|
進程C申請空間(M=4, P=4)<失敗進入等待隊列> |
|||||||
4 |
A |
B |
D |
|
|
進程D申請空間(M=1, P=4)<成功> |
|||||||
5 |
A |
C |
D |
|
|
進程B結束,釋放空間 進程C從等待隊列取出,分配空間 進程E申請空間(M=3, P=4)<失敗進入等待隊列> |
|||||||
6 |
A |
C |
D |
|
|
|
|||||||
7 |
A |
C |
D |
|
|
|
|||||||
8 |
A |
C |
E |
進程D結束,釋放空間 進程E從等待隊列取出,分配空間 |
|||||||||
9 |
A |
|
|
|
|
E |
進程C結束,釋放空間 |
||||||
10 |
A |
|
|
|
|
E |
|
||||||
11 |
|
|
|
|
|
|
|
E |
進程A結束,釋放空間 |
||||
12 |
|
|
|
|
|
|
|
|
|
|
進程E結束,釋放空間 |
具體題目看http://poj.org/problem?id=1193 是中文的
本身一開始想暴力模擬,單身很難實現
後來「抄」了std的代碼,用的是鏈表+二叉堆(有嗎?)
//author: sysky //copy: XuHt #include<cstdio> #include<vector> #include<algorithm> #include<queue> #define INF 0x3fffffff using namespace std; int n,w=INF,cnt=0; struct data{ int t,m,p,s; bool operator <(const data x) const{ return s<x.s; } }x; vector<data> p; queue<data> q; bool work_in(int t) { if (p.empty() || p[0].s >= x.m) { x.s = 0; x.t = t; p.push_back(x); sort(p.begin(), p.end()); return 1; } for (unsigned int i = 1; i < p.size(); i++) if (p[i].s - (p[i-1].s + p[i-1].m) >= x.m) { x.s = p[i-1].s + p[i-1].m; x.t = t; p.push_back(x); sort(p.begin(), p.end()); return 1; } int sz = p.size(); if (n - (p[sz-1].s + p[sz-1].m) >= x.m) { x.s = p[sz-1].s + p[sz-1].m; x.t = t; p.push_back(x); sort(p.begin(), p.end()); return 1; } return 0; } void work_out() { int nw = INF; for (unsigned int i = 0; i < p.size(); i++) if (p[i].t + p[i].p == w) p.erase(p.begin() + i--); else nw = min(nw, p[i].t + p[i].p); while (q.size()) { x = q.front(); if (work_in(w)) { nw = min(nw, q.front().t + q.front().p); q.pop(); cnt++; } else break; } w = nw; } void work(int t, int m, int p) { while (t >= w) work_out(); x.t = t; x.m = m; x.p = p; if (work_in(t)) w = min(w, t + p); else q.push(x); } int main() { scanf("%d",&n); int t0,m0,p0; while(scanf("%d%d%d",&t0,&m0,&p0)==3 &&!(t0==0&&m0==0&&p0==0)) work(t0,m0,p0); while(q.size()) work_out(); int ans=w; for(int i=0;i<p.size();i++) ans=max(ans,p[i].t+p[i].p); printf("%d\n%d\n",ans,cnt); return 0; }
我太菜了