AtCoder題解 —— AtCoder Beginner Contest 187 —— D - Choose Me —— 貪心
技術標籤:OJ題解# AtCoder題解AtCoder題解ABC187D題Choose Me貪心
題目相關
題目連結
AtCoder Beginner Contest 187 D 題,https://atcoder.jp/contests/abc187/tasks/abc187_d。
Problem Statement
AtCoder City will hold a mayoral election. The candidates are Aoki and Takahashi.
The city consists of
N
N
N towns, the
i
i
i-th of which has
A
i
A_i
Takahashi can make a speech in each town.
If he makes a speech in some town, all voters in that town, pro-Takahashi or pro-Aoki, will vote for Takahashi.
On the other hand, if he does not make a speech in some town, the pro-Aoki voters in that town will vote for Aoki, and the pro-Takahashi voters will not vote.
Input
Input is given from Standard Input in the following format:
N
Ai Bi
.
.
AN BN
Output
Print the answer.
Sample 1
Sample Input 1
4
2 1
2 2
5 1
1 3
Sample Output 1
1
Explaination
After making a speech in the third town, Aoki and Takahashi will get 5 and 6 votes, respectively.
Sample 2
Sample Input 2
5
2 1
2 1
2 1
2 1
2 1
Sample Output 2
3
Explaination
After making speeches in three towns, Aoki and Takahashi will get 4 and 9 votes, respectively.
Sample 3
Sample Input 3
1
273 691
Sample Output 3
1
Constraints
- All values in input are integers.
- 1 ≤ N ≤ 2 × 1 0 5 1≤N≤2×10^5 1≤N≤2×105
- 1 ≤ A i , B i ≤ 1 0 9 1≤A_i,B_i≤10^9 1≤Ai,Bi≤109
題解報告
題目翻譯
AtCoder 城市將矩形一次投票,只有兩個候選人 Aoki 和 Takahashi。
城市包括
N
N
N 個城鎮,第
i
i
i 個城鎮有
A
i
A_i
Ai 票給 Aoki,
B
i
B_i
Bi 票給 Takahashi。
Takahashi 可以在每個城鎮發表一次演說。演說後,這個城鎮都將所有的票投給 Takahashi。而不在某個城鎮演說,該城鎮的
B
i
B_i
Bi 票不會參加投票,
A
i
A_i
Ai 票繼續投給 Aoki。
為了贏得選舉,Takahashi 最少要在幾個城鎮發表演說。
題目分析
根據題意,第
i
i
i 個城鎮有
A
i
A_i
Ai 票給 Aoki,
B
i
B_i
Bi 票給 Takahashi。只要 Takahashi 在第
i
i
i 城鎮發表演說,在這個城鎮將得到
A
i
+
B
i
A_i+B_i
Ai+Bi 的票,同時 Aoki 將減少
A
i
A_i
Ai 的票。也就是說,Takahashi 在第
i
i
i 城鎮發表演說,他的收益將是
2
∗
A
i
+
B
i
2*A_i+B_i
2∗Ai+Bi。
因此我們只需要記錄 Aoki 總票,然後利用貪心的思路,解決本題。
資料分析
樣例資料 1
根據樣例資料,我們可以得到以下的資料。
Aoki 的總票數為
10
10
10 票。對於 Takahashi 的而言,每個城鎮發表演說的收益如下表。
城鎮 | 收益 |
---|---|
1 | 5 |
2 | 6 |
3 | 11 |
4 | 5 |
使用貪心的思路,我們將這個收益從大到小排序。得到表格如下。
城鎮 | 收益 |
---|---|
3 | 11 |
2 | 6 |
1 | 5 |
4 | 5 |
在每個城鎮發表演說後,Aoki 的票變為
10
−
b
e
n
e
f
i
t
[
i
]
10-benefit[i]
10−benefit[i],只要 Aoki 的票第一次達到負數,說明我們一直找到答案。
我們遍歷所有城鎮,看 Takahashi 發表幾次演說。
Takahashi 先在第 3 個城鎮發表演說,這樣,Aoki 的票數將變為
10
−
11
=
−
1
10-11=-1
10−11=−1,這樣,我們只需要發表一次演說即可。
樣例資料 2
根據樣例資料,我們可以得到以下的資料。
Aoki 的總票數為
10
10
10 票。對於 Takahashi 的而言,每個城鎮發表演說的收益如下表。
城鎮 | 收益 |
---|---|
1 | 5 |
2 | 5 |
3 | 5 |
4 | 5 |
使用貪心的思路,我們將這個收益從大到小排序。得到表格如下。
城鎮 | 收益 |
---|---|
1 | 5 |
2 | 5 |
3 | 5 |
4 | 5 |
我們遍歷所有城鎮,看 Takahashi 發表幾次演說。
Takahashi 在第 1 個城鎮發表演說,這樣,Aoki 的票數將變為
10
−
5
=
5
10-5=5
10−5=5。
Takahashi 在第 2 個城鎮發表演說,這樣,Aoki 的票數將變為
5
−
5
=
0
5-5=0
5−5=0。
Takahashi 在第 3 個城鎮發表演說,這樣,Aoki 的票數將變為
0
−
5
=
−
5
0-5=-5
0−5=−5。
這樣,Takahashi 需要發表
3
3
3 次演說。
資料規模分析
N N N 的最大值為 2 ∗ 1 0 5 2*10^5 2∗105,每個城鎮的最大值為 1 0 9 10^9 109,因此 Aoki 的最大票數為 2 ∗ 1 0 5 ∗ 1 0 9 = 2 ∗ 1 0 14 2*10^5*10^9=2*10^{14} 2∗105∗109=2∗1014。最大的 b e n e f i t benefit benefit 為 2 ∗ 1 0 9 + 1 0 9 = 3 ∗ 1 0 9 2*10^9+10^9=3*10^9 2∗109+109=3∗109。因此我們需要使用 long long 來描述。
AC 程式碼
//https://atcoder.jp/contests/abc187/tasks/abc187_d
//D - Choose Me
#include <bits/stdc++.h>
using namespace std;
//如果提交到OJ,不要定義 __LOCAL
//#define __LOCAL
typedef long long ll;
const int MAXN=2e5+4;
ll vote[MAXN];
int main() {
#ifndef __LOCAL
//這部分程式碼需要提交到OJ,本地除錯不使用
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#endif
int n;
cin>>n;
ll avote=0;
for (int i=1; i<=n; i++) {
ll a,b;
cin>>a>>b;
avote += -a;//記錄a的票數
vote[i] = 2*a+b;
}
sort(vote+1, vote+n+1, greater<ll>());
//遍歷求解
int ans=0;
for (int i=1; i<=n; i++) {
avote += vote[i];
if (avote>0) {
ans=i;
break;
}
}
cout<<ans<<"\n";
#ifdef __LOCAL
//這部分程式碼不需要提交到OJ,本地除錯使用
system("pause");
#endif
return 0;
}
時間複雜度
O ( N l o g N ) O(NlogN) O(NlogN)。
空間複雜度
O ( N ) O(N) O(N)。