Submission #508669

#TimeUsernameProblemLanguageResultExecution timeMemory
508669Jeff12345121Pinball (JOI14_pinball)C++14
0 / 100
1 ms844 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; 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++) { 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...