这是一道典型的模拟题
首先我们把借钥匙和还钥匙切分成两个事件 保存于两个数组中
然后我对还钥匙的活动按照时间发生次序和还得钥匙序号排序,即按照题意对事件发生的次序排序
最后按照时间的进行 一个一个进行活动的发生就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 (" "); 54 return 0; 55 }