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: