[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;
}
posted @ 2024-09-10 21:18  maniubi  阅读(12)  评论(0编辑  收藏  举报