比赛 20250904开学热身赛 评测结果 AAAAA
题目名称 内存分配 最终得分 100
用户昵称 会挽弯弓满月 运行时间 0.171 s
代码语言 C++ 内存使用 3.84 MiB
提交时间 2025-09-04 20:22:29
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10,inf=1e9+7;
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<48||c>57){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c>=48&&c<=57){
		x=x*10+c-48;
		c=getchar();
	}
	return f*x;
}
struct node{
	int t,m,p,s;
}x;
int n,cnt;
int last;
vector<node> w;
queue<node> q;
bool cmp(node a,node b){
	return a.s<b.s;
}
bool enter(int t){
	if(w.empty()||w[0].s>=x.m){
		x.s=0;x.t=t;
		w.push_back(x);
		sort(w.begin(),w.end(),cmp);
		return 1;
	}
	int si;
	for(int i=1;i<w.size();i++){
		si=w[i].s-w[i-1].s-w[i-1].m;
		if(si>=x.m){
			x.s=w[i-1].s+w[i-1].m;
			x.t=t;
			w.push_back(x);
			sort(w.begin(),w.end(),cmp);
			return 1;
		}
	}
	int la=w.size()-1;
	si=n-w[la].s-w[la].m;
	if(si>=x.m){
		x.s=w[la].s+w[la].m;
		x.t=t;
		w.push_back(x);
		sort(w.begin(),w.end(),cmp);
		return 1;
	}
	return 0;
}
void exit(){
	int ti,now=inf;
	for(int i=0;i<w.size();i++){
		ti=w[i].t+w[i].p;
		if(ti==last){
			w.erase(w.begin()+i);
			i--;
		}
		else now=min(now,ti);
	}
	while(q.size()){
		x=q.front();
		if(enter(last)){
			ti=q.front().t+q.front().p;
			now=min(now,ti);
			cnt++;
			q.pop();
		}
		else break;
	}
	last=now;
	return;
}
void solve(int t,int m,int p){
	while(t>=last) exit();
	x.t=t;x.m=m;x.p=p;
	if(enter(t)) last=min(last,t+p);
	else q.push(x);
	return;
}
int main(){
	freopen("memory.in","r",stdin);
	freopen("memory.out","w",stdout);
	int t0,m0,p0;
	n=read();
	last=inf;
	while(1){
		t0=read();m0=read();p0=read();
		if(t0==0&&m0==0&&p0==0) break;
		solve(t0,m0,p0);
	}
	while(q.size()) exit();
	int ti;
	for(int i=0;i<w.size();i++){
		ti=w[i].t+w[i].p;
		last=max(last,ti);
	}
	printf("%d\n%d",last,cnt);
	return 0;
}