这是一道模拟题
给定内存空间的长度和多个对内存的申请
每个申请包括T、M、P,分别为开始时间,空间长度,使用时长
对每个请求分配空间,如果可以分配,则分配起始地址最小的内存
否则将该请求插入等待队列,队头优先级最高,在每个空间释放后优先考虑队头是否可以完成,完成后出队
要求输出完成所有请求的时长和进入等待队列的请求数
对已使用的空间我们用set维护
set< pair> 的first代表起始地址,second代表空间长度
对内存的释放顺序利用小根对维护
priority_queue< pair,vector,greater> 的first代表释放时间,second代表起始地址
等待队列则直接用队列模拟
queue< pair> 的first代表空间大小,second代表占用时长
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
const int N=10010;
int ans,n,cnt;
set<PII> runs;
queue<PII> waits;
priority_queue<PII,vector<PII>,greater<PII> > endts;
bool give(int t,int m,int p)
{
set<PII>::iterator it = runs.begin();
int last=0;
for(set<PII>::iterator it = runs.begin();it!=runs.end();it++)
{
if( (*it).first - last >= m )
{
runs.insert({last,m});
endts.push({t+p,last});
return 1;
}
last=(*it).first+(*it).second;
}
return 0;
}
void finish(int t)
{
while(endts.size() && endts.top().first<=t)
{
int fm=endts.top().first;
while(endts.size() && endts.top().first==fm)
{
PII now=endts.top();endts.pop();
set<PII>::iterator it = runs.lower_bound({now.second,0});
if(it!=runs.end())runs.erase(it);
}
while(waits.size())
{
PII next = waits.front();
if(give(fm,next.first,next.second))
waits.pop();
else break;
}
ans=max(ans,fm);
}
return ;
}
int main()
{
int t,m,p;
cin>>n;
runs.insert({n,0});
while(cin>>t>>m>>p,t||m||p)
{
finish(t);
if(!give(t,m,p))cnt++,waits.push({m,p});
}
finish(2e9);
cout<<ans<<endl<<cnt;
return 0;
}