Official

D - Choose Me Editorial by tatyam


高橋氏が青木氏より多く票を獲得するためには、高橋氏の得る票数を増やし、青木氏の得る票数を減らすことが重要です。
そこで、 \(X={}\)(高橋氏の得る票数) \(-\) (青木氏の得る票数) と定義すると、

  • \(i\) 番目の町で新たに演説をすると \(X\)\(2A_i+B_i\) 増える
  • \(X>0\) になると高橋氏が青木氏より多く票を獲得する

ということが分かります。
したがって、 \(X>0\) になるまで \(2A_i+B_i\) が大きい町から順に演説を行えば良いです。
時間計算量は \(O(N \log N)\) です。

回答例 (C++)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = int64_t;

int main(){
    ll N;
    cin >> N;
    ll X = 0;
    vector<ll> x(N);
    for(ll i = 0; i < N; i++){
        ll A, B;
        cin >> A >> B;
        X -= A;
        x[i] = A + A + B;
    }
    sort(x.begin(), x.end());
    ll ans = 0;
    while(X <= 0){
        X += x.back();
        x.pop_back();
        ans++;
    }
    cout << ans << endl;
}

回答例 (Python)

N = int(input())
X = 0
x = []
for i in range(N):
    A, B = map(int, input().split())
    X -= A
    x.append(A + A + B)
x.sort()
ans = 0
while X <= 0:
    X += x.pop()
    ans += 1
print(ans)

posted:
last update: