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: