Submission #508726

#TimeUsernameProblemLanguageResultExecution timeMemory
508726Jeff12345121Pinball (JOI14_pinball)C++14
11 / 100
1091 ms94812 KiB
#include <bits/stdc++.h> #define in cin #define out cout #define int long long using namespace std; //ifstream in("in.in"); //ofstream out("out.out"); struct device { int l, r, hole, cost; }; vector<device> devices; const int nmax = 20, mmax = 1005, inf = (1LL << 60); int n, m, dp[nmax][mmax][mmax]; void minSelf(int &a, int b) { if (b < a) { a = b; } } int32_t main() { in >> n >> m; if (m == 1) { out << "0\n"; return 0; } devices.resize(n + 1); for (int i = 1; i <= n; i++) { int l, r, hole, cost; in >> l >> r >> hole >> cost; devices[i] = {l, r, hole, cost}; } /// dp[i][l][r] = using only devices i...n, we have extended the road for the interval /// l - r. sum will be in dp[1][1..m] for (int i = 0; i <= n + 1; i++) { for (int l = 0; l <= m; l++) { for (int r = 0; r <= m; r++) { dp[i][l][r] = inf; } } } for (int i = m; i >= 1; i--) { dp[n + 1][i][i] = 0; } for (int i = n; i >= 1; i--) { for (int l = 1; l <= m; l++) { for (int r = l; r <= m; r++) { minSelf(dp[i][l][r], dp[i + 1][l][r]); if (dp[i + 1][l][r] == inf) continue; if (l <= devices[i].hole && devices[i].hole <= r) { int newL = min(l, devices[i].l); int newR = max(r, devices[i].r); minSelf(dp[i][newL][newR], dp[i + 1][l][r] + devices[i].cost); minSelf(dp[i][l][r], dp[i + 1][l][r]); } } } } if (dp[1][1][m] == inf) { out << "-1\n"; } else { out << dp[1][1][m] << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...