Skip to content

Commit 27457f2

Browse files
committed
feat: add solutions to lc problem: No.1883. Minimum Skips to Arrive at Meeting on Time
1 parent 43eceeb commit 27457f2

File tree

4 files changed

+146
-6
lines changed

4 files changed

+146
-6
lines changed

solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README.md

+58-3
Original file line numberDiff line numberDiff line change
@@ -65,27 +65,82 @@
6565
<li><code>1 <= hoursBefore <= 10<sup>7</sup></code></li>
6666
</ul>
6767

68-
6968
## 解法
7069

7170
<!-- 这里可写通用的实现逻辑 -->
7271

72+
“动态规划”实现。
73+
74+
定义 `dp[i][j]` 表示前 i 段道路,跳过了 j 次的最短路程(耗时也一样)。
75+
76+
考虑最后一段道路 `dist[i - 1]` 是否跳过:
77+
78+
- 若没有跳过,那么 `dp[i][j] = ⌈dp[i - 1][j] + dist[i - 1] / speed⌉`
79+
- 若跳过,那么 `dp[i][j] = dp[i - 1][j - 1] + dist[i - 1] / speed`
80+
81+
综合两种情况,`dp[i][j] = min{⌈dp[i - 1][j] + dist[i - 1] / speed⌉, dp[i - 1][j - 1] + dist[i - 1] / speed}`
82+
7383
<!-- tabs:start -->
7484

7585
### **Python3**
7686

7787
<!-- 这里可写当前语言的特殊实现逻辑 -->
7888

7989
```python
80-
90+
class Solution:
91+
def minSkips(self, dist: List[int], speed: int, hoursBefore: int) -> int:
92+
n = len(dist)
93+
dp = [[float('inf')] * (n + 1) for _ in range(n + 1)]
94+
dp[0][0] = 0
95+
for i in range(1, n + 1):
96+
for j in range(i + 1):
97+
if i != j:
98+
# 没有跳过
99+
dp[i][j] = min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) // speed + 1) * speed)
100+
if j > 0:
101+
# 跳过
102+
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + dist[i - 1])
103+
for i in range(n + 1):
104+
if dp[n][i] <= hoursBefore * speed:
105+
return i
106+
return -1
81107
```
82108

83109
### **Java**
84110

85111
<!-- 这里可写当前语言的特殊实现逻辑 -->
86112

87113
```java
88-
114+
class Solution {
115+
public int minSkips(int[] dist, int speed, int hoursBefore) {
116+
int n = dist.length;
117+
int[][] dp = new int[n + 1][n + 1];
118+
for (int i = 0; i <= n; ++i) {
119+
for (int j = 0; j <= n; ++j) {
120+
dp[i][j] = Integer.MAX_VALUE;
121+
}
122+
}
123+
dp[0][0] = 0;
124+
for (int i = 1; i <= n; ++i) {
125+
for (int j = 0; j <= i; ++j) {
126+
if (i != j) {
127+
// 没有跳过
128+
dp[i][j] = Math.min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) / speed + 1) * speed);
129+
}
130+
if (j > 0) {
131+
// 跳过
132+
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - 1] + dist[i - 1]);
133+
}
134+
}
135+
}
136+
for (int i = 0; i <= n; ++i) {
137+
if (dp[n][i] <= hoursBefore * speed) {
138+
return i;
139+
}
140+
}
141+
return -1;
142+
}
143+
}
89144
```
90145

91146
### **...**

solution/1800-1899/1883.Minimum Skips to Arrive at Meeting On Time/README_EN.md

+45-3
Original file line numberDiff line numberDiff line change
@@ -61,21 +61,63 @@ You can skip the first and third rest to arrive in ((7/2 + <u>0</u>) + (3/2 + 0)
6161
<li><code>1 &lt;= hoursBefore &lt;= 10<sup>7</sup></code></li>
6262
</ul>
6363

64-
6564
## Solutions
6665

6766
<!-- tabs:start -->
6867

6968
### **Python3**
7069

7170
```python
72-
71+
class Solution:
72+
def minSkips(self, dist: List[int], speed: int, hoursBefore: int) -> int:
73+
n = len(dist)
74+
dp = [[float('inf')] * (n + 1) for _ in range(n + 1)]
75+
dp[0][0] = 0
76+
for i in range(1, n + 1):
77+
for j in range(i + 1):
78+
if i != j:
79+
dp[i][j] = min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) // speed + 1) * speed)
80+
if j > 0:
81+
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + dist[i - 1])
82+
for i in range(n + 1):
83+
if dp[n][i] <= hoursBefore * speed:
84+
return i
85+
return -1
7386
```
7487

7588
### **Java**
7689

7790
```java
78-
91+
class Solution {
92+
public int minSkips(int[] dist, int speed, int hoursBefore) {
93+
int n = dist.length;
94+
int[][] dp = new int[n + 1][n + 1];
95+
for (int i = 0; i <= n; ++i) {
96+
for (int j = 0; j <= n; ++j) {
97+
dp[i][j] = Integer.MAX_VALUE;
98+
}
99+
}
100+
dp[0][0] = 0;
101+
for (int i = 1; i <= n; ++i) {
102+
for (int j = 0; j <= i; ++j) {
103+
if (i != j) {
104+
// 没有跳过
105+
dp[i][j] = Math.min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) / speed + 1) * speed);
106+
}
107+
if (j > 0) {
108+
// 跳过
109+
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - 1] + dist[i - 1]);
110+
}
111+
}
112+
}
113+
for (int i = 0; i <= n; ++i) {
114+
if (dp[n][i] <= hoursBefore * speed) {
115+
return i;
116+
}
117+
}
118+
return -1;
119+
}
120+
}
79121
```
80122

81123
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public int minSkips(int[] dist, int speed, int hoursBefore) {
3+
int n = dist.length;
4+
int[][] dp = new int[n + 1][n + 1];
5+
for (int i = 0; i <= n; ++i) {
6+
for (int j = 0; j <= n; ++j) {
7+
dp[i][j] = Integer.MAX_VALUE;
8+
}
9+
}
10+
dp[0][0] = 0;
11+
for (int i = 1; i <= n; ++i) {
12+
for (int j = 0; j <= i; ++j) {
13+
if (i != j) {
14+
dp[i][j] = Math.min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) / speed + 1) * speed);
15+
}
16+
if (j > 0) {
17+
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - 1] + dist[i - 1]);
18+
}
19+
}
20+
}
21+
for (int i = 0; i <= n; ++i) {
22+
if (dp[n][i] <= hoursBefore * speed) {
23+
return i;
24+
}
25+
}
26+
return -1;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def minSkips(self, dist: List[int], speed: int, hoursBefore: int) -> int:
3+
n = len(dist)
4+
dp = [[float('inf')] * (n + 1) for _ in range(n + 1)]
5+
dp[0][0] = 0
6+
for i in range(1, n + 1):
7+
for j in range(i + 1):
8+
if i != j:
9+
dp[i][j] = min(dp[i][j], ((dp[i - 1][j] + dist[i - 1] - 1) // speed + 1) * speed)
10+
if j > 0:
11+
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + dist[i - 1])
12+
for i in range(n + 1):
13+
if dp[n][i] <= hoursBefore * speed:
14+
return i
15+
return -1

0 commit comments

Comments
 (0)