[COCI2022-2023#2] Tramvaji
[COCI2022-2023#2] Tramvaji
题意
对于每个车站 \(i\),给出一条信息。
从车站 \(j<i\) 到车站 \(i\) 花费了时间 \(t\)。
求出哪两个站之间花费的时间最少。
思路
考虑求出 \(s_i\) 表示从 \(1\) 到 \(i\) 的最少时间。
答案即 \(\min_{i=2}^{n} s_i-s_{i-1}\)。
对于给出的信息 \((i,j,t)\),\(s_j =\min s_i+t\)。
代码
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int N = 1e3 + 5;
int n, a[N][N], sum[N], ans = 1e9;
pii ANS;
void solve() {
cin >> n;
string op;
memset(sum, 0x3f, sizeof(sum));
memset(a, 0x3f, sizeof(a));
for (int i = 2; i <= n; i ++) {
cin >> op;
if (op == "Patrik") {
int t; cin >> t;
a[1][i] = t;
}
if (op == "Josip") {
int y, t; cin >> y >> t;
a[y][i] = t;
}
}
sum[1] = 0;
for (int i = 2; i <= n; i ++) {
for (int j = 1; j < i; j ++) {
sum[i] = min(sum[i], sum[j] + a[j][i]);
}
}
for (int i = 2; i <= n; i ++) {
if (sum[i] - sum[i - 1] < ans) {
ans = sum[i] - sum[i - 1];
ANS = {i - 1, i};
}
}
cout << ans << " " << ANS.fi << " " << ANS.se << "\n";
}
signed main() {
int T = 1;
// cin >> T;
while (T --)
solve();
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18407231,orz