首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

HDU 5437 Alisha's Party:優先隊列模擬禮物接收順序

     編輯:關於C

題目大意

n 人攜帶價值 vᵢ 禮物到達,共開門 m 次,第 i 次在第 aᵢ 人到達時開門放入 bᵢ 人。規則:禮物價值高者優先,價值相同先到先進。所有人到達後再開一次門放入剩餘人。q 次詢問第 k 個進場者的名字。

模擬流程

  1. 將所有人按到達時間排序(輸入順序即到達順序,id 為時間戳)。
  2. 將開門事件按觸發人數 aᵢ 排序。
  3. 維護一個最大堆(優先隊列),比較器:價值大優先,價值同 id 小優先。
  4. 遍歷人員到達,依次加入堆。每到達一人檢查是否觸發開門事件,若觸發則從堆彈出指定數量人員記錄進場順序。
  5. 所有人到達後,將堆中剩餘人員全部彈出記錄。
  6. 回答查詢:直接輸出記錄陣列中第 k-1 位人員的名字。

關鍵數據結構

struct Person {
    int id, value;
    char name[220];
    bool operator<(const Person& o) const {
        return value == o.value ? id > o.id : value < o.value; // 大頂堆
    }
};

struct DoorEvent {
    int trigger, count;
    bool operator<(const DoorEvent& o) const { return trigger < o.trigger; }
};

邊界情況

  • m = 0:無中途開門,所有人到達後一次性按優先級進場。
  • 查詢 k 可能超過總人數?題目保證合法。
  • 堆操作總次數 O(n log n),n ≤ 150000,滿足時限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved