Submission #1179045

#TimeUsernameProblemLanguageResultExecution timeMemory
1179045kl_2200100003Palembang Bridges (APIO15_bridge)C++17
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct Citizen {
    char from_zone, to_zone;
    int from_building, to_building;
};

ll cost_with_bridge(int a, int b, int bridge_pos) {
    return abs(a - bridge_pos) + 1 + abs(b - bridge_pos);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int K, N;
    cin >> K >> N;

    vector<Citizen> citizens(N);
    vector<pair<int, int>> crossers;
    ll total_cost = 0;

    for (int i = 0; i < N; ++i) {
        string s;
        cin >> s;
        citizens[i].from_zone = s[0];
        int j = 1;
        while (isdigit(s[j])) citizens[i].from_building = citizens[i].from_building * 10 + (s[j++] - '0');
        citizens[i].to_zone = s[j++];
        while (j < s.size()) citizens[i].to_building = citizens[i].to_building * 10 + (s[j++] - '0');

        if (citizens[i].from_zone == citizens[i].to_zone) {
            total_cost += abs(citizens[i].from_building - citizens[i].to_building);
        } else {
            crossers.emplace_back(citizens[i].from_building, citizens[i].to_building);
        }
    }

    if (crossers.empty()) {
        cout << total_cost << '\n';
        return 0;
    }

    vector<int> ideal_positions;
    for (auto &[a, b] : crossers) {
        ideal_positions.push_back((a + b) / 2);
    }
    sort(ideal_positions.begin(), ideal_positions.end());

    vector<int> bridge_positions;
    if (K >= ideal_positions.size()) {
        bridge_positions = ideal_positions;
    } else {
       
        int per_cluster = ideal_positions.size() / K;
        int remainder = ideal_positions.size() % K;
        int idx = 0;
        for (int i = 0; i < K; ++i) {
            int len = per_cluster + (i < remainder);
            int mid = idx + len / 2;
            bridge_positions.push_back(ideal_positions[mid]);
            idx += len;
        }
    }

    for (auto &[a, b] : crossers) {
        ll best = LLONG_MAX;
        for (int bridge : bridge_positions) {
            best = min(best, cost_with_bridge(a, b, bridge));
        }
        total_cost += best;
    }

    cout << total_cost << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...