2023-07-07 LeetCode每日一题(过桥的时间)

这篇具有很好参考价值的文章主要介绍了2023-07-07 LeetCode每日一题(过桥的时间)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023-07-07每日一题

一、题目编号

2532. 过桥的时间

二、题目链接

点击跳转到题目位置

三、题目描述

共有 k 位工人计划将 n 个箱子从旧仓库移动到新仓库。给你两个整数 n 和 k,以及一个二维整数数组 time ,数组的大小为 k x 4 ,其中 time[i] = [leftToRighti, pickOldi, rightToLefti, putNewi] 。

一条河将两座仓库分隔,只能通过一座桥通行。旧仓库位于河的右岸,新仓库在河的左岸。开始时,所有 k 位工人都在桥的左侧等待。为了移动这些箱子,第 i 位工人(下标从 0 开始)可以:

  • 从左岸(新仓库)跨过桥到右岸(旧仓库),用时 leftToRighti 分钟。
  • 从旧仓库选择一个箱子,并返回到桥边,用时 pickOldi 分钟。不同工人可以同时搬起所选的箱子。
  • 从右岸(旧仓库)跨过桥到左岸(新仓库),用时 rightToLefti 分钟。
  • 将箱子放入新仓库,并返回到桥边,用时 putNewi 分钟。不同工人可以同时放下所选的箱子。

如果满足下面任一条件,则认为工人 i 的 效率低于 工人 j :

  • leftToRighti + rightToLefti > leftToRightj + rightToLeftj
  • leftToRighti + rightToLefti == leftToRightj + rightToLeftj 且 i > j

工人通过桥时需要遵循以下规则:

  • 如果工人 x 到达桥边时,工人 y 正在过桥,那么工人 x 需要在桥边等待。
  • 如果没有正在过桥的工人,那么在桥右边等待的工人可以先过桥。如果同时有多个工人在右边等待,那么 效率最低 的工人会先过桥。
  • 如果没有正在过桥的工人,且桥右边也没有在等待的工人,同时旧仓库还剩下至少一个箱子需要搬运,此时在桥左边的工人可以过桥。如果同时有多个工人在左边等待,那么 效率最低 的工人会先过桥。

所有 n 个盒子都需要放入新仓库,请你返回最后一个搬运箱子的工人 到达河左岸 的时间。

提示:

  • 1 <= n, k <= 104
  • time.length == k
  • time[i].length == 4
  • 1 <= leftToRighti, pickOldi, rightToLefti, putNewi <= 1000

四、解题代码

/*
    time[i][0] : leftToRight
    time[i][1] : pickOld
    time[i][2] : rightToLeft
    time[i][3] : putNew
*/

class Solution {
public:
    using p = pair<int, int>;
    int findCrossingTime(int n, int k, vector<vector<int>>& time) {
        auto wait_priority_cmp = [&](int x, int y) {
            int time_x = time[x][0] + time[x][2];
            int time_y = time[y][0] + time[y][2];
            return time_x != time_y ? time_x < time_y : x < y;
        };
        /*
        优先队列1 左右等待
        */
        priority_queue<int, vector<int>, decltype(wait_priority_cmp)> wait_left(wait_priority_cmp),
    wait_right(wait_priority_cmp);
        /*
        优先队列2 左右工作
        */

        priority_queue<p, vector<p>, greater<p>> work_left, work_right;

        int remain_box = n, cur_time = 0;
        for(int i = 0; i < k; ++i){
            wait_left.push(i);
        }
        while(remain_box > 0 || !work_right.empty() || !wait_right.empty()){
            while (!work_left.empty() && work_left.top().first <= cur_time) {
                wait_left.push(work_left.top().second);
                work_left.pop();
            }
            
            while (!work_right.empty() && work_right.top().first <= cur_time) {
                wait_right.push(work_right.top().second);
                work_right.pop();
            }

            if (!wait_right.empty()) {
                // 2. 若右侧有工人在等待,则取出优先级最低的工人并过桥
                int id = wait_right.top();
                wait_right.pop();
                cur_time += time[id][2];
                work_left.push({cur_time + time[id][3], id});
            } else if (remain_box > 0 && !wait_left.empty()) {
                // 3. 若右侧还有箱子,并且左侧有工人在等待,则取出优先级最低的工人并过桥
                int id = wait_left.top();
                wait_left.pop();
                cur_time += time[id][0];
                work_right.push({cur_time + time[id][1], id});
                remain_box--;
            } else {
                // 4. 否则,没有人需要过桥,时间过渡到 work_left 和 work_right 中的最早完成时间
                int next_time = INT_MAX;
                if (!work_left.empty()) {
                    next_time = min(next_time, work_left.top().first);
                }
                if (!work_right.empty()) {
                    next_time = min(next_time, work_right.top().first);
                }
                if (next_time != INT_MAX) {
                    cur_time = max(next_time, cur_time);
                }
            }
        }
        return cur_time;
    }
};

五、解题思路

(1) 采用优先队列进行模拟。文章来源地址https://www.toymoban.com/news/detail-555870.html

到了这里,关于2023-07-07 LeetCode每日一题(过桥的时间)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode - 每日一题】2594. 修车的最少时间(23.09.07)

    给定每个师傅修车的时间和需要修的车辆总数,计算修理所有汽车需要的最少时间。 师傅可以同时修车。 看到题目没有任何头绪,直接查看题解。 至于为什么用二分做呢,讨论区有个友友这么说到: 对于修理时间 t t t 来说: 若 t t t 时间内可以修理完所有车,则大于等于

    2024年02月09日
    浏览(52)
  • 2023-07-28 LeetCode每日一题(并行课程 III)

    点击跳转到题目位置 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。同时给你一个二维整数数组 relations ,其中 relations[j] = [prevCourse j , nextCourse j ] ,表示课程 prevCoursej 必须在课程 nextCourse j 之前 完成(先修课的关系)。同时给你一个下标从 0 开始的整数数组 time ,其

    2024年02月15日
    浏览(48)
  • 2023-07-13 LeetCode每日一题(下降路径最小和)

    点击跳转到题目位置 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的 下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左

    2024年02月15日
    浏览(79)
  • 2023-07-30 LeetCode每日一题(环形链表 II)

    点击跳转到题目位置 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链

    2024年02月15日
    浏览(60)
  • 2023/07/01_leetcode每日一题_1. 两数之和

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 一开始审错题了,还以

    2024年02月12日
    浏览(52)
  • 2023/07/02_leetcode每日一题_2.两数相加

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:l1 = [9,9,9,9,9,9

    2024年02月11日
    浏览(48)
  • 2023/07/11_leetcode每日一题_16. 最接近的三数之和

    给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 和三数之和那道题一样,排序加双指针

    2024年02月15日
    浏览(62)
  • 2023-09-08 LeetCode每日一题(计算列车到站时间)

    点击跳转到题目位置 给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实际到站的时间。 注意,该问题中的时间采用 24 小时制。 示例 1: 示例 2: 提示: 1 = arrivaltime 24 1 = delayedTime = 24 (1) 运用

    2024年02月09日
    浏览(55)
  • LeetCode每日一题:2594. 修车的最少时间(2023.9.7 C++)

    目录 2594. 修车的最少时间 题目描述: 实现代码与解析: 二分 原理思路:         给你一个整数数组  ranks  ,表示一些机械工的  能力值  。 ranksi  是第  i  位机械工的能力值。能力值为  r  的机械工可以在  r * n2  分钟内修好  n  辆车。 同时给你一个整数  cars

    2024年02月09日
    浏览(51)
  • LeetCode 每日一题 2023/7/10-2023/7/16

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 7/10 16. 最接近的三数之和 排序 先确定一个最小数 双指针确定之后两个数 7/11 1911. 最大子序列交替和 dp dp[i][0/1] 表示第i个数坐标为偶数或奇数的最大交替和 dp[i][0]=max(dp[i-1][0],dp[i-1][1

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包