這是一道典型的模擬題
首先我們把借鑰匙和還鑰匙切分成兩個事件 保存於兩個數組中
然后我對還鑰匙的活動按照時間發生次序和還得鑰匙序號排序,即按照題意對事件發生的次序排序
最后按照時間的進行 一個一個進行活動的發生就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 }