Submission #1272485

#TimeUsernameProblemLanguageResultExecution timeMemory
1272485witek_cppLet's Win the Election (JOI22_ho_t3)C++20
5 / 100
4 ms352 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

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

    int N, K;
    cin >> N >> K;
    vector<pair<int,int>> states(N);
    for (int i=0;i<N;i++) cin >> states[i].first >> states[i].second; // Ai, Bi

    const ll INF = 4e18;
    ll ans = INF;

    // posortowane po Ai i Bi
    vector<int> orderA(N), orderB;
    iota(orderA.begin(), orderA.end(), 0);
    sort(orderA.begin(), orderA.end(), [&](int i,int j){ return states[i].first < states[j].first; });

    for (int i=0;i<N;i++) if (states[i].second != -1) orderB.push_back(i);
    sort(orderB.begin(), orderB.end(), [&](int i,int j){ return states[i].second < states[j].second; });

    // prefix sums dla Ai
    vector<ll> prefA(N+1,0);
    for (int i=0;i<N;i++) prefA[i+1] = prefA[i] + states[orderA[i]].first;

    // prefix sums dla Bi
    vector<ll> prefB(orderB.size()+1,0);
    for (int i=0;i<(int)orderB.size();i++) prefB[i+1] = prefB[i] + states[orderB[i]].second;

    for (int m=0;m<=orderB.size();m++) { // ilu pomagierów kupimy
        if (m > orderB.size()) break;
        if (m > 0 && prefB[m] >= INF) continue;

        // wybieramy K głosów (uwzględniając, że stany pomagierów mogą też być głosem)
        // żeby to obsłużyć łatwo: weźmy listę wszystkich Ai, ale dla stanów z kupionym pomagierem weźmy min(Ai,0) w praktyce -> Ai
        // implementacja: po prostu wybieramy minK spośród wszystkich stanów
        vector<int> used(orderB.begin(), orderB.begin()+m);
        vector<bool> mark(N,false);
        for (int id: used) mark[id]=true;

        // zbieramy wszystkie Ai, a stany z pomagierami są już zaznaczone
        vector<int> candidates;
        for (int i=0;i<N;i++) candidates.push_back(states[i].first);
        sort(candidates.begin(), candidates.end());

        if (K > N) continue;
        ll sumA = 0;
        for (int i=0;i<K;i++) sumA += candidates[i];

        ll total = prefB[m] + sumA;
        ll time = (total + m) / (m+1); // ceil dzielenia
        ans = min(ans, time);
    }

    cout << ans << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...