leetcode 3633. 最早完成陆地和水上游乐设施的时间 I 简单

给你两种类别的游乐园项目:陆地游乐设施水上游乐设施

  • 陆地游乐设施
    • landStartTime[i] -- 第 i 个陆地游乐设施最早可以开始的时间。
    • landDuration[i] -- 第 i 个陆地游乐设施持续的时间。
  • 水上游乐设施
    • waterStartTime[j] -- 第 j 个水上游乐设施最早可以开始的时间。
    • waterDuration[j] -- 第 j 个水上游乐设施持续的时间。

一位游客必须从 每个 类别中体验 恰好 一个 游乐设施,顺序 不限

  • 游乐设施可以在其开放时间开始,或 之后任意时间开始。
  • 如果一个游乐设施在时间 t 开始,它将在时间 t + duration 结束。
  • 完成一个游乐设施后,游客可以立即乘坐另一个(如果它已经开放),或者等待它开放。

返回游客完成这两个游乐设施的 最早可能时间

示例 1:

**输入:**landStartTime = 2,8, landDuration = 4,1, waterStartTime = 6, waterDuration = 3

**输出:**9

解释:

  • 方案 A(陆地游乐设施 0 → 水上游乐设施 0):
    • 在时间 landStartTime[0] = 2 开始陆地游乐设施 0。在 2 + landDuration[0] = 6 结束。
    • 水上游乐设施 0 在时间 waterStartTime[0] = 6 开放。立即在时间 6 开始,在 6 + waterDuration[0] = 9 结束。
  • 方案 B(水上游乐设施 0 → 陆地游乐设施 1):
    • 在时间 waterStartTime[0] = 6 开始水上游乐设施 0。在 6 + waterDuration[0] = 9 结束。
    • 陆地游乐设施 1 在 landStartTime[1] = 8 开放。在时间 9 开始,在 9 + landDuration[1] = 10 结束。
  • 方案 C(陆地游乐设施 1 → 水上游乐设施 0):
    • 在时间 landStartTime[1] = 8 开始陆地游乐设施 1。在 8 + landDuration[1] = 9 结束。
    • 水上游乐设施 0 在 waterStartTime[0] = 6 开放。在时间 9 开始,在 9 + waterDuration[0] = 12 结束。
  • 方案 D(水上游乐设施 0 → 陆地游乐设施 0):
    • 在时间 waterStartTime[0] = 6 开始水上游乐设施 0。在 6 + waterDuration[0] = 9 结束。
    • 陆地游乐设施 0 在 landStartTime[0] = 2 开放。在时间 9 开始,在 9 + landDuration[0] = 13 结束。

方案 A 提供了最早的结束时间 9。

示例 2:

**输入:**landStartTime = 5, landDuration = 3, waterStartTime = 1, waterDuration = 10

**输出:**14

解释:

  • 方案 A(水上游乐设施 0 → 陆地游乐设施 0):
    • 在时间 waterStartTime[0] = 1 开始水上游乐设施 0。在 1 + waterDuration[0] = 11 结束。
    • 陆地游乐设施 0 在 landStartTime[0] = 5 开放。立即在时间 11 开始,在 11 + landDuration[0] = 14 结束。
  • 方案 B(陆地游乐设施 0 → 水上游乐设施 0):
    • 在时间 landStartTime[0] = 5 开始陆地游乐设施 0。在 5 + landDuration[0] = 8 结束。
    • 水上游乐设施 0 在 waterStartTime[0] = 1 开放。立即在时间 8 开始,在 8 + waterDuration[0] = 18 结束。

方案 A 提供了最早的结束时间 14。

提示:

  • 1 <= n, m <= 100
  • landStartTime.length == landDuration.length == n
  • waterStartTime.length == waterDuration.length == m
  • 1 <= landStartTime[i], landDuration[i], waterStartTime[j], waterDuration[j] <= 1000

分析:暴力枚举所有水上项目和陆地项目的组合。可以先玩陆地项目再玩水上项目,也可以反过来,分别计算这两种顺序下的最优结果,然后取其中的最小值。以"先陆地、后水上"为例,计算逻辑如下:

对于陆地项目,分别计算它的开始时间 + 持续时间。准备玩第二个项目时,会遇到两种情况:

若水上项目已经开放,则可以立即开始,完成时刻就是第一个项目的结束时间 + 水上项目的持续时间。若水上项目还没开放,则必须等到它开始才能玩,完成时刻就是水上项目的开始时间 + 水上项目的持续时间。再交换顺序,按照同样的方法计算先水上、后陆地的最早完成时间。

cpp 复制代码
class Solution {
public:
    int earliestFinishTime(vector<int>& landStartTime, vector<int>& landDuration, vector<int>& waterStartTime, vector<int>& waterDuration) {
        int n=landStartTime.size(),m=waterStartTime.size(),ans=100000;
        for(int i=0;i<n;++i)
        {
            int temp=landStartTime[i]+landDuration[i];
            for(int j=0;j<m;++j)
            {
                if(waterStartTime[j]<=temp)ans=min(ans,temp+waterDuration[j]);
                else ans=min(waterStartTime[j]+waterDuration[j],ans);
            }
        }
        for(int i=0;i<m;++i)
        {
            int temp=waterStartTime[i]+waterDuration[i];
            for(int j=0;j<n;++j)
            {
                if(landStartTime[j]<=temp)ans=min(ans,temp+landDuration[j]);
                else ans=min(landStartTime[j]+landDuration[j],ans);
            }
        }
        return ans;
    }
};
相关推荐
菜菜的顾清寒1 小时前
力扣HOT100(51) 动态规划-单词拆分
算法·leetcode·动态规划
ʚ希希ɞ ྀ2 小时前
全排列 --- 回溯
算法·leetcode·深度优先
8Qi82 小时前
LeetCode 124. 二叉树中的最大路径和(Hard)
算法·leetcode·二叉树·递归
And_Ii2 小时前
LeetCode 1. 两数之和 python
数据结构·算法·leetcode
Navigator_Z10 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
语戚13 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
8Qi815 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
Lsk_Smion17 小时前
力扣实训 _ [200].岛屿数量
算法·leetcode·深度优先
Lsk_Smion18 小时前
力扣实训 _ [543].二叉树的直径 _ [23].合并K个升序列表
数据结构·算法·leetcode