比赛 20250904开学热身赛 评测结果 MMMMM
题目名称 内存分配 最终得分 0
用户昵称 Hollow07 运行时间 2.466 s
代码语言 C++ 内存使用 238.53 MiB
提交时间 2025-09-04 20:42:18
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long

struct node{
	ll t,m,p,s;
	bool operator <(const node& x)const{
        return s<x.s;
    }
}x;

ll n,ans,cnt,w=1e9;//ans为全部进程都运行完毕的时刻,cnt为被放入过等待队列的进程总数,w为当前最先结束进程的时间 
queue <node> wait;//等待队列 
vector <node> now;//现在内存状态 

bool workin(ll t){//是否可以加入新进程 
	if (now.empty()||now[0].s>=x.m){//判断内存前方空间是否可以添加进程 
		x.s=0;
		x.t=t;
		now.push_back(x);
		sort(now.begin(),now.end());
		return 1;
	}
	for (int i=1;i<now.size();i++){//判断内存中间空间是否可以添加进程 
		if ((now[i].s-now[i-1].s-now[i-1].m)>=x.m){
			x.s=now[i-1].s+now[i-1].m;
            x.t=t;
            now.push_back(x);
            sort(now.begin(),now.end());
            return 1;
		}
	}
	ll sizz=now.size();
	if (n-now[sizz-1].s-now[sizz-1].m>=x.m){//判断内存后方空间是否可以添加进程 
		x.s=now[sizz-1].s+now[sizz-1].m;
		x.t=t;
		now.push_back(x);
		sort(now.begin(),now.end());
		return 1;
	}
    return 0;
}

void workout(){//弹出等待队列中的进程 
	ll nn=1e9;
	for (int i=0;i<now.size();i++){
		if (now[i].t+now[i].p==w) now.erase(now.begin()+i),i--;
		else nn=min(nn,now[i].t+now[i].p);
	}
	while(wait.size()){
		x=wait.front();
        if (workin(w)){
        	x=wait.front();
            nn=min(nn,x.t+x.p);
            wait.pop();
        }else break;
	}
	w=nn;
}

void work(ll t,ll m,ll p){//对每个进程进行处理 
	while (t>=w) workout();//若当前时间大于最先结束进程时间,弹出等待队列进程 
	x.t=t;
	x.m=m;
	x.p=p;
	if (workin(t)) w=min(w,t+p);
	else wait.push(x),cnt++;
}

int main(){
//	freopen("in.in","r",stdin);
	freopen("memory.out","w",stdin);
	freopen("memory.out","w",stdout);
	scanf("%lld",&n);
	ll tt,mm,pp;
	while(1){
		scanf("%lld %lld %lld",&tt,&mm,&pp);
		if (tt==0&&mm==0&&pp==0) break;
		work(tt,mm,pp);
	}
	while (wait.size()) workout();
	ans=w;
	for (int i=0;i<now.size();i++){
		ans=max(ans,now[i].t+now[i].p);
	}
	printf("%lld\n%lld",ans,cnt);
	return 0;
}