CCF201709-2 公共鑰匙盒


試題名稱:公共鑰匙盒
問題描述

  有一個學校的老師共用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 using namespace std;
 4 struct Node{
 5     int key;
 6     int time;
 7     int flag;
 8     bool operator <(Node a) const
 9     {
10         if(time!=a.time) return time>a.time;//小的優先級高 
11         else if(flag!=a.flag) return flag>a.flag; 
12         else return key>a.key;
13     }
14 };
15 priority_queue<Node> q;
16 const int maxN=1000;
17 int main(){
18     int N,K,w,s,c;
19     cin>>N>>K;
20     int box[maxN+1];
21     for(int i=1;i<N+1;i++){
22         box[i]=i;
23     }
24     Node event1[K];
25     Node event2[K];
26     Node temp;
27     for(int i=0;i<K;i++){
28         cin>>w>>s>>c;
29         event1[i].key=w; 
30         event1[i].time=s;
31         event1[i].flag=1;        
32         event2[i].key=w;
33         event2[i].time=s+c;
34         event2[i].flag=-1;
35         q.push(event1[i]);
36         q.push(event2[i]);
37     }
38     while(!q.empty()){
39         temp=q.top();
40         q.pop();
41         if(temp.flag==1){
42             int j=1;
43             while(box[j]!=temp.key) j++;
44             box[j]=0;
45         }                                
46         else {
47             int j=1;
48             while(box[j]!=0) j++;
49             box[j]=temp.key;
50         }         
51     }
52     cout<<box[1];
53     for(int i=2;i<N+1;i++){
54         cout<<" "<<box[i];
55     }
56     cout<<endl;
57     return 0;
58 }

 


免責聲明!

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



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