LintCode 1677. 石头(自定义优先队列)
生活随笔
收集整理的這篇文章主要介紹了
LintCode 1677. 石头(自定义优先队列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給定數組 p 代表 n 個石頭的位置和數組 d 代表這 n 塊石頭能夠扔的距離。
從左(0位置)往右走。當你第 k 次碰到一個石頭時,
如果 k 是奇數, 把這個石頭往右扔;
如果 k 是偶數,跳過這個石頭。
返回不再會碰到石頭時,最右邊的石頭的位置。
樣例 1: 輸入: p = [1, 2], d = [5, 4] 輸出: 11 解釋: 一開始,位置1上的石頭扔到位置6。然后跳過位置2的石頭。接著位置6的時候被扔到位置11。最后跳過位置11的石頭。樣例 2: 輸入: p = [1, 6], d = [5, 6] 輸出: 12 解釋: 一開始,位置1上的石頭扔到位置6。然后跳過位置6的石頭(更大的石頭)。接著位置6的時候被扔到位置12。最后跳過位置12的石頭。注意事項 n <= 10^4 p[i] <= 10^5 d[i] <= 10^3 如果兩個或多個石頭停留在相同位置, 你先碰到的是最大的石頭(即 **d[i] 最小**的石頭)。 意味著首先扔或跳過較大的石頭。2. 解題
unordered_map<int,int> m;// 序號idx,石頭能扔的dis距離 struct cmp {bool operator()(const auto& a,const auto& b){if(a.second == b.second)//距離一樣,小的先出隊return m[a.first] > m[b.first];return a.second > b.second;//距離近的先出隊} };class Solution { public:int getDistance(vector<int> &p, vector<int> &d) {if(p.size() == 0)return 0;bool flag = true;priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> q;// pair :序號 idx, 石頭位置for(int i = 0; i < p.size(); ++i){m[i] = d[i];// idx,能扔的disq.push(make_pair(i, p[i]));//初始位置}pair<int,int> tp;while(!q.empty()){tp = q.top();q.pop();if(flag){q.push(make_pair(tp.first, tp.second+m[tp.first]));}flag = !flag;//奇偶交替}return tp.second;} };100% 數據通過測試
總耗時 100 ms
您的提交打敗了 46.88% 的提交!
總結
以上是生活随笔為你收集整理的LintCode 1677. 石头(自定义优先队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--树--线段树(Segment
- 下一篇: LintCode 1862. 给树浇水的