K - パンプキン Editorial by east1016


スヌケ君が召喚するカードの集合を \(S\) とおくと、問題文の条件は次の式と同値です。

\[ \sum_{i \in S} C_i \leq \sum_{i \in \overline{S}} G_i \]

この式の両辺に \(\sum_{i \in S} G_i\) を加えて整理すると、次のようになります。

\[ \sum_{i \in S} (C_i + G_i) \leq \sum_{i=0}^{N} G_i \]

右辺は定数なので、\((C_i + G_i)\) を昇順に見て貪欲にカードを選択することにより解を導くことができます。計算量は \(O(N \log N)\) です。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<long> c(n), g(n), v(n);
    long sum_g = 0;
    for (int i = 0; i < n; i++) {
        cin >> c[i] >> g[i];
        sum_g += g[i];
        v[i] = c[i] + g[i];
    }
    sort(v.begin(), v.end());
    int ans = 0;
    long now = 0;
    for (int i = 0; i < n; i++) {
        if (now + v[i] <= sum_g) {
            now += v[i];
            ans++;
        }
    }
    cout << ans << endl;
}

posted:
last update: