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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ccf-csp #201709-2 公共钥匙盒

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 公共钥匙盒的全部內容,希望文章能夠幫你解決所遇到的問題。

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