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

#define ll long long
#define cpy(a,b) copy(begin(a),end(a),begin(b))
#define ld long double
#define dot(x) fixed<<setprecision(x)
#define foru(a,b,c) for(ll a=b;a<=c;a++)

ll n,num=1,t[10005],m[10005],p[10005],ans;
struct program{
    ll id,t,op;//进程id,时间,1入0出
};
vector<program>timelist;
struct memorylist{
    ll l,r;
}used_[10005];
vector<memorylist>free_;
queue<ll>waitlist;

bool tlcmp(program a,program b){
    if(a.t!=b.t){
        return a.t<b.t;
    }else{
        return a.op<b.op;
    }
}

bool mlcmp(memorylist a,memorylist b){
    return a.l<b.l;
}

int main(){
    freopen("memory.in" ,"r",stdin );
    freopen("memory.out","w",stdout);
    cin>>n;
    while(cin>>t[num]>>m[num]>>p[num]&&!(t[num]+m[num]+p[num]==0)){
        timelist.push_back({num,t[num],1});
        timelist.push_back({num,t[num]+p[num],0});
        num++;
    }
    sort(timelist.begin(),timelist.end(),tlcmp);
    num--;
    bool sorted=1;
    free_.push_back({0,n});
    for(auto x:timelist){
        if(x.op){
            if(!waitlist.empty()&&!sorted){
                sort(free_.begin(),free_.end(),mlcmp);
                for(ll i=1;i<free_.size();i++){
                    if(free_[i-1].r==(free_[i].l-1)){
                        free_[i-1].r=free_[i].r;
                        free_[i]={1,0};
                    }
                }
                sorted=1;
                while(!waitlist.empty()){
                    bool ok=0;
                    ll f=waitlist.front();
                    for(auto i:free_){
                        if(i.r-i.l+1>=m[f]){
                            used_[f]={i.l,i.l+m[f]-1};
                            i.l+=m[f];
                            ok=1;
                            break;
                        }
                    }
                    if(!ok){
                        break;
                    }
                }
                
            }
            if(!sorted){
                sort(free_.begin(),free_.end(),mlcmp);
                for(ll i=1;i<free_.size();i++){
                    if(free_[i-1].r==(free_[i].l-1)){
                        free_[i-1].r=free_[i].r;
                        free_[i]={1,0};
                    }
                }
                sorted=1;
            }
            bool ok=0;
            for(auto i:free_){
                if(i.r-i.l+1>=m[x.id]){
                    used_[x.id]={i.l,i.l+m[x.id]-1};
                    i.l+=m[x.id];
                    ok=1;
                    break;
                }
            }
            if(!ok){
                waitlist.push(x.id);
                ans++;
            }
        }else{
            sorted=0;
            ll tl=used_[x.id].l,tr=used_[x.id].r;
            free_.push_back({tl,tr});
        }
    }
    cout<<t[num]+p[num]<<"\n"<<ans;
    return 0;
}