제출 #1148012

#제출 시각아이디문제언어결과실행 시간메모리
1148012tito_daynorCoin Collecting (JOI19_ho_t4)C++17
0 / 100
0 ms324 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; class CoinCollector { private: int N; vector<vector<ll>> dp; vector<vector<ll>> coins; ll processInitialPosition(ll x, ll y) { ll moves = 0; if (x < 1) { moves += 1 - x; x = 1; } else if (x > N) { moves += x - N; x = N; } if (y < 1) { moves += 1 - y; y = 1; } else if (y > 2) { moves += y - 2; y = 2; } coins[x][y-1]++; return moves; } ll calculateMinimumMoves() { dp.assign(N + 2, vector<ll>(N + 2, 0)); for (int len = 1; len <= N; len++) { for (int i = 1; i + len - 1 <= N; i++) { int j = i + len - 1; ll up = 0, down = 0; for (int k = i; k <= j; k++) { up += coins[k][0] - 1; down += coins[k][1] - 1; } if (len == 1) { dp[i][j] = abs(up) + abs(down); if (up > 0 && down < 0) { dp[i][j] += min(up, -down); } else if (up < 0 && down > 0) { dp[i][j] += min(-up, down); } } else { dp[i][j] = LLONG_MAX; for (int k = i; k < j; k++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + len); } } } } return dp[1][N]; } public: ll solve() { cin >> N; coins.assign(N + 1, vector<ll>(2, 0)); ll initial_moves = 0; for (int i = 0; i < 2 * N; i++) { ll x, y; cin >> x >> y; initial_moves += processInitialPosition(x, y); } return initial_moves + calculateMinimumMoves(); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); CoinCollector solver; cout << solver.solve() << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...