[COCI2022-2023#2] Tramvaji

maniubi發表於2024-09-10

[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;
}