典型的模拟题,将借钥匙和还钥匙切分成两个事件,保存在两个数组中,然后按照题意对事件发生次序排序,最后按照时间,一个一个进行活动的发生
using namespace std;
#include<bits/stdc++.h>
struct teacher{
int id;
int time;
};
const int N=1005;
int x[N],p[N];//x盒子中的钥匙,p钥匙的位置
teacher a[N],b[N];//a是借钥匙序列,b是还钥匙序列
int x1,x2;//x1是下一个要借的钥匙,x2是下一个要还的钥匙
int n,k;
bool cmp(teacher a,teacher b){
if(a.time == b.time) return a.id<b.id;//时间相同的,序号小的在前面
return a.time<b.time;
}
void re(int id){
for(int i=1;i<=n;i++){
if(x[i] == 0){
x[i]=id;
p[id]=i;
return ;
}
}
}
int main(){
cin>>n>>k;
int i,j;
for(i=1;i<=n;i++){
x[i]=i;
p[i]=i;
}
int w,s,c;
for(i=1;i<=k;i++){
cin>>w>>s>>c;
teacher t1,t2;
t1.id=w;
t1.time=s;
t2.id=w;
t2.time=s+c;
a[i]=t1;
b[i]=t2;
}
sort(a+1,a+k+1,cmp);
sort(b+1,b+k+1,cmp);
x1=1;
x2=1;
int start,end;
start=a[1].time;
end=b[k].time;
for(i=start;i<=end;i++){
while(b[x2].time == i && x2<=k){//先还后借
re(b[x2].id);
x2++;
}
while(a[x1].time == i && x1<=k){
x[p[a[x1].id]]=0;//注意!p[a[x1].id] 才是要借钥匙的位置
x1++;
}
}
for(i=1;i<=n;i++){
cout<<x[i]<<" ";
}
return 0;
}