#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
struct Position {
ll x, y;
Position(ll _x = 0, ll _y = 0) : x(_x), y(_y) {}
};
ll manhattan_distance(const Position& a, const Position& b) {
return abs(a.x - b.x) + abs(a.y - b.y);
}
ll bfs(Position start, Position target) {
return manhattan_distance(start, target);
}
ll solve_assignment(vector<Position>& coins, vector<Position>& targets) {
ll total_moves = 0;
vector<bool> used(targets.size(), false);
for(size_t i = 0; i < coins.size(); i++) {
ll min_dist = LLONG_MAX;
size_t best_target = 0;
for(size_t j = 0; j < targets.size(); j++) {
if(!used[j]) {
ll dist = bfs(coins[i], targets[j]);
if(dist < min_dist) {
min_dist = dist;
best_target = j;
}
}
}
used[best_target] = true;
total_moves += min_dist;
}
return total_moves;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
vector<Position> coins(2 * N);
for(int i = 0; i < 2 * N; i++) {
cin >> coins[i].x >> coins[i].y;
}
vector<Position> targets;
for(int x = 1; x <= N; x++) {
for(int y = 1; y <= 2; y++) {
targets.push_back(Position(x, y));
}
}
ll result = solve_assignment(coins, targets);
cout << result << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |