📜  门| GATE CS 2019 |简体中文第40章(1)

📅  最后修改于: 2023-12-03 15:12:37.094000             🧑  作者: Mango

门| GATE CS 2019 |简体中文第40章

本文是2019年GATE计算机科学考试中第40章的简体中文翻译。

背景

GATE(Graduate Aptitude Test in Engineering)是印度的全国性研究生招生考试。GATE考试涵盖工程,科学和技术等主题,是印度最重要的与研究生相关的考试之一。同时,GATE也是为申请印度公立大学和研究所提供的国家水平的资格考试。

题目描述

假设您在一个海滩上,前面有n个门,您必须通过这些门才能到达目的地。第i个门开放了只有一个特定的时间ti。

由于门之间的距离和海浪,您必须等待至少时间wi才能到达下一个门。您可以在一个门处停留,直到下一个门打开。

如果您有无限的时间,您可以在每个门处停留,只到下一个门打开。不过,这并不是您想要的。因此,您需要计算最短时间t,以便在这个时间内到达终点。

注意,如果您在等待它开门之前走过第i个门,则要重新等待时间wi。

编写一个程序来计算t。

输入格式

第一行包含两个整数n和m,分别表示门数量和终点位置。

接下来n行,每行包含t和w,其中t表示门开放时间,w表示经过门i和i+1之间所需等待的时间。

输出格式

输出一个整数,表示您到达目的地所需的最短时间。

样例输入
5 5
10 1
12 1
16 2
18 2
20 3
样例输出
24
题解

这是一个经典的DP问题,我们考虑用dp[i]表示在第i个门之前到达终点所需的最短时间。转移方程如下:

dp[i] = min{t[i] + max(0, dp[j]-t[j]+w[i](j=1, ··· , i-1) + w[i+1])}

解释一下这个方程,dp[i]表示到达第i个门所需的最短时间,因此t[i]是必需的时间,其中max(0, dp[j]-t[j]+w[i](j=1, ··· , i-1) + w[i+1])是旅行的时间。dp[j]-t[j]+w[i](j=1, ··· , i-1) 表示在第j个门和第i个门之间需要等待的时间,w[i+1]表示在最后一个门和终点之间需要等待的时间。

读取输入,计算dp[n]即可。时间复杂度为O(n^2)。

代码片段
n, m = map(int, input().split())
tw = [[0, 0] for _ in range(n + 1)]
for i in range(1, n+1):
    tw[i][0], tw[i][1] = map(int, input().split())

dp = [float('inf') for _ in range(n+1)]
dp[0] = 0

for i in range(1, n+1):
    wait = 0
    for j in range(i-1, -1, -1):
        wait += tw[j+1][1]
        dp[i] = min(dp[i], tw[i][0] + max(0, dp[j] - tw[j+1][0] + wait + tw[i+1][1]))

print(dp[m])

这是Python 3的代码片段,详细说明请见注释。