ccf-csp #201709-2 公共钥匙盒
生活随笔
收集整理的這篇文章主要介紹了
ccf-csp #201709-2 公共钥匙盒
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://118.190.20.162/view.page?gpid=T62
題目思路
- mark數組用來存儲第i號鑰匙的位置,優先隊列pq用來存取空掛鉤的位置(每次取最左空位的時間復雜度為O(logn)O(logn)O(logn),比直接用線性表的O(n)O(n)O(n)要快速)
- 我們把每次借用鑰匙和歸還鑰匙的時刻都當作時間節點,這樣我們就有2?k2*k2?k個時間節點。依照題意,我們按時間從早到晚,結合歸還優先、鑰匙編號小的優先策略對所有時間節點進行排序。
- 接下來,只要遍歷所有的時間節點,模擬借鑰匙和還鑰匙的操作就可以了。如果是借鑰匙操作,就把空位在優先隊列中記錄。否則,在優先隊列中讀取最左邊空掛鉤的位置,放回鑰匙并把該位置移出優先隊列。
代碼如下
#include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <vector> using namespace std; const int maxn = 2005; //用于表示執行借用或者歸還的時間點 struct Point{int id, Time, isRet;//isRet等于0表示借用,等于1表示歸還 } a[maxn]; int n, k, w, s, c; //mark[i]表示i存放的位置 int mark[maxn], res[maxn]; //小根堆,表示從左到右的空位 priority_queue<int, vector<int>, greater<int> > pq;bool cmp(const Point &A, const Point &B) {if (A.Time == B.Time) {if (A.isRet == B.isRet) {return A.id < B.id;} else {return A.isRet > B.isRet;}} else {return A.Time < B.Time;} } int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> k;for (int i = 1; i <= n; i++) mark[i] = i; for (int i = 1; i <= k; i++) {cin >> w >> s >> c;a[(i<<1)-1].id = w;a[(i<<1)-1].Time = s; //借用的時間節點a[(i<<1)-1].isRet = 0; a[i<<1].id = w;a[i<<1].Time = s + c; //歸還的時間節點a[i<<1].isRet = 1; }sort(a + 1, a + k * 2 + 1, cmp);int x = 0, y = 0;for (int i = 1; i <= k * 2; i++) {int key = a[i].id;if (a[i].isRet) {//return the keymark[key] = pq.top();pq.pop();} else {// borrow the keypq.push(mark[key]);}}for (int i = 1; i <= n; i++) res[mark[i]] = i;for (int i = 1; i <= n; i++) cout << res[i] << " ";cout << endl;return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ccf-csp #201709-2 公共钥匙盒的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ccf-csp #201703-2 学生
- 下一篇: 解决Eclipse查看源代码出现Sour