给你两种类别的游乐园项目:陆地游乐设施和水上游乐设施。
- 陆地游乐设施
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 <= 100landStartTime.length == landDuration.length == nwaterStartTime.length == waterDuration.length == m1 <= landStartTime[i], landDuration[i], waterStartTime[j], waterDuration[j] <= 1000
分析:暴力枚举所有水上项目和陆地项目的组合。可以先玩陆地项目再玩水上项目,也可以反过来,分别计算这两种顺序下的最优结果,然后取其中的最小值。以“先陆地、后水上”为例,计算逻辑如下:
对于陆地项目,分别计算它的开始时间 + 持续时间。准备玩第二个项目时,会遇到两种情况:
若水上项目已经开放,则可以立即开始,完成时刻就是第一个项目的结束时间 + 水上项目的持续时间。若水上项目还没开放,则必须等到它开始才能玩,完成时刻就是水上项目的开始时间 + 水上项目的持续时间。再交换顺序,按照同样的方法计算先水上、后陆地的最早完成时间。
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; } };