제출 #501128

#제출 시각아이디문제언어결과실행 시간메모리
501128Stickfish여행하는 상인 (APIO17_merchant)C++17
0 / 100
115 ms3408 KiB
#include <iostream> #include <cassert> #include <vector> using namespace std; using ll = long long; const ll INF = 1.77013e15; const int MAXN = 100; const int MAXK = 1000; ll buy[MAXN][MAXK]; ll sell[MAXN][MAXK]; vector<pair<int, ll>> edg[MAXN]; vector<pair<int, ll>> redg[MAXN]; ll d[MAXN][MAXN]; ll prof[MAXN][MAXN]; ll smoke[MAXN][MAXN]; ll immortal[MAXN][MAXN]; signed main() { int n, m, k; cin >> n >> m >> k; for (int i = 0; i < n; ++i) { for (int j = 0; j < k; ++j) { cin >> buy[i][j] >> sell[i][j]; if (buy[i][j] == -1) buy[i][j] = INF; if (sell[i][j] == -1) sell[i][j] = 0; } } for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; --u, --v; edg[u].push_back({v, w}); edg[v].push_back({u, w}); } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { d[i][j] = INF; } d[i][i] = 0; for (auto [v, dv] : edg[i]) { d[i][v] = dv; } } for (int i = 0; i < n; ++i) { for (int v = 0; v < n; ++v) { for (int u = 0; u < n; ++u) { d[v][u] = min(d[v][u], d[v][i] + d[i][u]); } } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int w = 0; w < n; ++w) { assert(d[i][j] + d[j][w] >= d[i][w]); } } } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int t = 0; t < k; ++t) { prof[i][j] = max(prof[i][j], sell[j][t] - buy[i][t]); } } assert(prof[i][i] == 0); } ll lb = 0, ub = INF; while (ub - lb > 1) { ll mb = (lb + ub) / 2; // (sum prof) / (sum time) >= mb // sum prof >= mb * (sum time) // sum {prof - mb * time} >= 0 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (d[i][j] == INF || prof[i][j] == 0) smoke[i][j] = -INF; else smoke[i][j] = prof[i][j] - mb * d[i][j]; immortal[i][j] = smoke[i][j]; } } for (int i = 0; i < n; ++i) { for (int v = 0; v < n; ++v) { for (int u = 0; u < n; ++u) { immortal[v][u] = max(immortal[v][u], immortal[v][i] + immortal[i][u]); } } } for (int i = 0; i < n; ++i) { if (immortal[i][i] > 0) { lb = mb; } } if (lb != mb) ub = mb; } cout << lb << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...