把拿钥匙、取钥匙分别作为事件存储,并按照时间点进行排序,然后按顺序处理事件即可。
这里要注意,同一时间点的事件,先归还后借出钥匙,同样是归还钥匙则按钥匙编号排序处理。代码如下:
#include <stdio.h>
typedef struct KEY_USAGE{
int num;
int get_return;//-1:get 1:return
int time;
}key_usage;
void swap(key_usage *u1,key_usage *u2){
key_usage a;
a.num=u1->num;
a.get_return=u1->get_return;
a.time=u1->time;
*u1=*u2;
*u2=a;
}
void sorting(key_usage usage[],int n){
int i,j;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(usage[j-1].time>usage[j].time){
swap(&usage[j-1],&usage[j]);
}
else if(usage[j-1].time==usage[j].time){
if(usage[j-1].get_return<usage[j].get_return){
swap(&usage[j-1],&usage[j]);
}
else if(usage[j-1].get_return==usage[j].get_return)
if(usage[j-1].num>usage[j].num){
swap(&usage[j-1],&usage[j]);
}
}
}
}
}
int main(){
int N,K,i,j,w,s,c;
scanf("%d%d",&N,&K);
key_usage usage[K*2];
int *key;
key=(int *)calloc(N,sizeof(int));
for(i=0;i<N;i++){
key[i]=i+1;
}
for(i=0;i<K*2;i+=2){
scanf("%d%d%d",&w,&s,&c);
usage[i].num=w;
usage[i].get_return=-1;
usage[i].time=s;
usage[i+1].num=w;
usage[i+1].get_return=1;
usage[i+1].time=s+c;
}
sorting(usage,K*2);
for(i=0;i<K*2;i++){
if(usage[i].get_return==-1){//Get
for(j=0;j<N;j++)
if(key[j]==usage[i].num){
key[j]=0;
break;
}
}
else{//Return
for(j=0;j<N;j++){
if(key[j]==0){
key[j]=usage[i].num;
break;
}
}
}
}
for(i=0;i<N-1;i++){
printf("%d ",key[i]);
}
printf("%d",key[i]);
return 0;
}