ccf-170902-公共鑰匙盒(模擬)


這是一道典型的模擬題 

首先我們把借鑰匙和還鑰匙切分成兩個事件 保存於兩個數組中 

然后我對還鑰匙的活動按照時間發生次序和還得鑰匙序號排序,即按照題意對事件發生的次序排序

最后按照時間的進行 一個一個進行活動的發生就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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM