日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

公共钥匙盒 ccf

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 公共钥匙盒 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

總結

以上是生活随笔為你收集整理的公共钥匙盒 ccf的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。