这是一道典型的模拟题 

首先我们把借钥匙和还钥匙切分成两个事件 保存于两个数组中 

然后我对还钥匙的活动按照时间发生次序和还得钥匙序号排序,即按照题意对事件发生的次序排序

最后按照时间的进行 一个一个进行活动的发生就ok啦

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6 struct T {
 7     int id;
 8     int _time;
 9 };
10 const int N=1000+7;
11 int x[N],p[N];// x 模拟钥匙盒 x[i]=j 表示i位置放置j x[i]=0表示空
12               // p[i]=j  i钥匙放置的位置是j
13 T t1[N],t2[N];// t1[] 表示 要借钥匙的请求 (id和时间) 
14              //  t2[] 表示  要还的钥匙序号和时间 
15 int n1,n2;//  n1 表示下一个要借的钥匙
16           //  n2 表示下一个要还的钥匙
17 int n,k;
18 bool cmp (T a, T b) {// 时间第一关键字 序号第二关键字
19     if (a._time==b._time)
20         return a.id<b.id;
21     return a._time<b._time;
22 }
23 void re ( int id ) {// 找到第一个空位置还书
24     for (int i=1;i<=n;i++)  
25         if (x[i]==0) {
26             x[i]=id;
27             p[id]=i;
28             break;
29         }
30     return ;
31 }
32 int main ()
33 {
34     scanf ("%d %d",&n,&k);
35     for (int i=1;i<=n;i++) 
36         x[i]=p[i]=i;
37     for (int i=1;i<=k;i++) {
38         int w,s,c;
39         scanf ("%d %d %d",&w,&s,&c);
40         T x1={w,s}; t1[i]=x1;
41         T x2={w,s+c}; t2[i]=x2;
42     }
43     sort (t1+1,t1+1+k,cmp); n1=1;
44     sort (t2+1,t2+1+k,cmp); n2=1;
45     int _start=t1[1]._time;
46     int _end=t2[k]._time;
47     for (int i=_start;i<=_end;i++) {// 模拟时间的进行,进行活动的发生 
48         while (n2<=k&&t2[n2]._time==i)  { re (t2[n2].id); n2++; }  //同一时间先还
49         while (n1<=k&&t1[n1]._time==i)  { int pos=p[t1[n1].id]; x[pos]=0; n1++;}
50     }
51     for (int i=1;i<=n;i++)
52         printf ("%d ",x[i]);
53     printf ("\n");
54     return 0;
55 }