前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode 1677. 石头(自定义优先队列)

LintCode 1677. 石头(自定义优先队列)

作者头像
Michael阿明
发布2020-07-13 17:16:56
4100
发布2020-07-13 17:16:56
举报

1. 题目

给定数组 p 代表 n 个石头的位置和数组 d 代表这 n 块石头能够扔的距离。

从左(0位置)往右走。当你第 k 次碰到一个石头时, 如果 k 是奇数, 把这个石头往右扔; 如果 k 是偶数,跳过这个石头。

返回不再会碰到石头时,最右边的石头的位置。

代码语言:javascript
复制
样例 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. 解题

代码语言:javascript
复制
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,能扔的dis
            q.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% 的提交!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档