公共钥匙盒 ccf
| 試題編號: | 201709-2 | 
| 試題名稱: | 公共鑰匙盒 | 
| 時間限制: | 1.0s | 
| 內存限制: | 256.0MB | 
| 問題描述: | 問題描述 有一個學校的老師共用N個教室,按照規定,所有的鑰匙都必須放在公共鑰匙盒里,老師不能帶鑰匙回家。每次老師上課前,都從公共鑰匙盒里找到自己上課的教室的鑰匙去開門,上完課后,再將鑰匙放回到鑰匙盒中。 鑰匙盒一共有N個掛鉤,從左到右排成一排,用來掛N個教室的鑰匙。一串鑰匙沒有固定的懸掛位置,但鑰匙上有標識,所以老師們不會弄混鑰匙。 每次取鑰匙的時候,老師們都會找到自己所需要的鑰匙將其取走,而不會移動其他鑰匙。每次還鑰匙的時候,還鑰匙的老師會找到最左邊的空的掛鉤,將鑰匙掛在這個掛鉤上。如果有多位老師還鑰匙,則他們按鑰匙編號從小到大的順序還。如果同一時刻既有老師還鑰匙又有老師取鑰匙,則老師們會先將鑰匙全還回去再取出。 今天開始的時候鑰匙是按編號從小到大的順序放在鑰匙盒里的。有K位老師要上課,給出每位老師所需要的鑰匙、開始上課的時間和上課的時長,假設下課時間就是還鑰匙時間,請問最終鑰匙盒里面鑰匙的順序是怎樣的? 輸入格式 輸入的第一行包含兩個整數N,?K。 接下來K行,每行三個整數w,?s,?c,分別表示一位老師要使用的鑰匙編號、開始上課的時間和上課的時長??赡苡卸辔焕蠋熓褂猛话谚€匙,但是老師使用鑰匙的時間不會重疊。 保證輸入數據滿足輸入格式,你不用檢查數據合法性。 輸出格式 輸出一行,包含N個整數,相鄰整數間用一個空格分隔,依次表示每個掛鉤上掛的鑰匙編號。 樣例輸入 5 2 4 3 3 2 2 7 樣例輸出 1 4 3 2 5 樣例說明 第一位老師從時刻3開始使用4號教室的鑰匙,使用3單位時間,所以在時刻6還鑰匙。第二位老師從時刻2開始使用鑰匙,使用7單位時間,所以在時刻9還鑰匙。 每個關鍵時刻后的鑰匙狀態如下(X表示空): 時刻2后為1X345; 時刻3后為1X3X5; 時刻6后為143X5; 時刻9后為14325。 樣例輸入 5 7 1 1 14 3 3 12 1 15 12 2 7 20 3 18 12 4 21 19 5 30 9 樣例輸出 1 2 3 5 4 評測用例規模與約定 對于30%的評測用例,1 ≤?N,?K?≤ 10, 1 ≤?w?≤?N, 1 ≤?s,?c?≤ 30; 對于60%的評測用例,1 ≤?N,?K?≤ 50,1 ≤?w?≤?N,1 ≤?s?≤ 300,1 ≤?c?≤ 50; 對于所有評測用例,1 ≤?N,?K?≤ 1000,1 ≤?w?≤?N,1 ≤?s?≤ 10000,1 ≤?c?≤ 100。 | 
分析:
用一個數組box表示鑰匙盒,數組的下標表示掛鉤的位置,數組的內容表示掛鉤上鑰匙的編號,創建一個結構體表示事件,包含鑰匙編號,以及時間結點,和flag標記表示取還是還。
把事件壓入優先隊列。首先時間結點的值越小優先級越大,如果時間相同則flag的值越小優先級越大(先還再取),若flag與時間都相同則key的值越小優先級越大(按從小到大順序先還再取)
優先隊列都存儲好之后取隊列頂部元素,每出列一個就對Box進行一次操作,而后彈出,取下一個隊頂元素。
最后輸出即可。
?
1 #include<iostream> 2 #include<queue> 3 4 using namespace std; 5 6 struct Node 7 { 8 int key; 9 int time; 10 int flag; // flag為1表示取,flag為-1表示還 11 12 bool operator >(const Node &a) const // 使用greater<Node>要求Node必須定義大于>運算符 13 { 14 if(time != a.time) 15 return time > a.time; 16 else if(flag != a.flag) 17 return flag > a.flag; 18 else 19 return key > a.key; 20 } 21 }; 22 23 priority_queue<Node, vector<Node>, greater<Node> > q; 24 const int maxN=1000; 25 26 int main() 27 { 28 int N,K,w,s,c; 29 cin>>N>>K; 30 int box[maxN+1]; 31 for(int i=1;i<N+1;i++) 32 box[i]=i; 33 Node event1[K]; 34 Node event2[K]; 35 Node temp; 36 for(int i=0;i<K;i++) 37 { 38 cin>>w>>s>>c; 39 event1[i].key=w; 40 event1[i].time=s; 41 event1[i].flag=1; 42 event2[i].key=w; 43 event2[i].time=s+c; 44 event2[i].flag=-1; 45 q.push(event1[i]); 46 q.push(event2[i]); 47 } 48 while(!q.empty()) 49 { 50 temp=q.top(); 51 q.pop(); 52 if(temp.flag==1) // 取鑰匙 53 { 54 int j=1; 55 while(box[j]!=temp.key) 56 j++; 57 box[j]=0; 58 } 59 else // 放鑰匙 60 { 61 int j=1; 62 while(box[j]!=0) 63 j++; 64 box[j]=temp.key; 65 } 66 } 67 cout<<box[1]; 68 for(int i=2;i<N+1;i++) 69 { 70 cout<<" "<<box[i]; 71 } 72 cout<<endl; 73 74 return 0; 75 }?
轉載于:https://www.cnblogs.com/FengZeng666/p/11516065.html
總結
 
                            
                        - 上一篇: Ubuntu下载gitea
- 下一篇: 汉诺塔III HDU - 2064
