Submission #522653

#TimeUsernameProblemLanguageResultExecution timeMemory
522653MonarchuwuCoin Collecting (JOI19_ho_t4)C++17
37 / 100
26 ms23036 KiB
/* duyệt từ trái sang đặt x là lượng coin có được x1 là lượng coin hàng trên dp[x1] là state có x1 coin hàng trên và x - x1 coin hàng dưới nếu thêm 1 coin hàng trên : dp[x - 1][i] -> dp[x][i + 1] nếu thêm 1 coin hàng dưới : dp[x - 1][i] -> dp[x][i] */ #include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define ff first #define ss second const ll inf = 1e18; const int N = 2000 + 3; int n; pii p[N]; ll dp[N][N]; int dist(pii a, pii b) { return abs(a.ff - b.ff) + abs(a.ss - b.ss); } int main() { cin.tie(NULL)->sync_with_stdio(false); cin >> n; for (int i = 1; i <= n * 2; ++i) cin >> p[i].ff >> p[i].ss; sort(p + 1, p + n * 2 + 1); ll sum(0); for (int i = 1; i <= n * 2; ++i) { fill(dp[i], dp[i] + i + 1, inf); if (p[i].ff < 1) { sum += 1 - p[i].ff; p[i].ff = 1; } if (n < p[i].ff) { sum += p[i].ff - n; p[i].ff = n; } if (p[i].ss < 1) { sum += 1 - p[i].ss; p[i].ss = 1; } if (2 < p[i].ss) { sum += p[i].ss - 2; p[i].ss = 2; } for (int x = 0; x < i; ++x) { // dp[i - 1][x] -> dp[i][x] // go to (i - x, 2) dp[i][x] = min(dp[i][x], dp[i - 1][x] + dist(p[i], pii(i - x, 2))); // dp[i - 1][x] -> dp[i][x + 1] // go to (x + 1, 1) dp[i][x + 1] = min(dp[i][x + 1], dp[i - 1][x] + dist(p[i], pii(x + 1, 1))); } } cout << sum + dp[n * 2][n] << '\n'; } /** /\_/\ * (= ._.) * / >0 \>1 **/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...