1. 程式人生 > 其它 >AtCoder題解 —— AtCoder Beginner Contest 187 —— D - Choose Me —— 貪心

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

Ai pro-Aoki voters and B i B_i Bi pro-Takahashi voters. There are no other voters.
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.
To get more votes than Aoki, in how many towns does Takahashi need to make speeches at least?

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 1N2×105
  • 1 ≤ A i , B i ≤ 1 0 9 1≤A_i,B_i≤10^9 1Ai,Bi109

題解報告

題目翻譯

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 2Ai+Bi
因此我們只需要記錄 Aoki 總票,然後利用貪心的思路,解決本題。

資料分析

樣例資料 1

根據樣例資料,我們可以得到以下的資料。
Aoki 的總票數為 10 10 10 票。對於 Takahashi 的而言,每個城鎮發表演說的收益如下表。

城鎮收益
15
26
311
45

使用貪心的思路,我們將這個收益從大到小排序。得到表格如下。

城鎮收益
311
26
15
45

在每個城鎮發表演說後,Aoki 的票變為 10 − b e n e f i t [ i ] 10-benefit[i] 10benefit[i],只要 Aoki 的票第一次達到負數,說明我們一直找到答案。
我們遍歷所有城鎮,看 Takahashi 發表幾次演說。
Takahashi 先在第 3 個城鎮發表演說,這樣,Aoki 的票數將變為 10 − 11 = − 1 10-11=-1 1011=1,這樣,我們只需要發表一次演說即可。

樣例資料 2

根據樣例資料,我們可以得到以下的資料。
Aoki 的總票數為 10 10 10 票。對於 Takahashi 的而言,每個城鎮發表演說的收益如下表。

城鎮收益
15
25
35
45

使用貪心的思路,我們將這個收益從大到小排序。得到表格如下。

城鎮收益
15
25
35
45

我們遍歷所有城鎮,看 Takahashi 發表幾次演說。
Takahashi 在第 1 個城鎮發表演說,這樣,Aoki 的票數將變為 10 − 5 = 5 10-5=5 105=5
Takahashi 在第 2 個城鎮發表演說,這樣,Aoki 的票數將變為 5 − 5 = 0 5-5=0 55=0
Takahashi 在第 3 個城鎮發表演說,這樣,Aoki 的票數將變為 0 − 5 = − 5 0-5=-5 05=5
這樣,Takahashi 需要發表 3 3 3 次演說。

資料規模分析

N N N 的最大值為 2 ∗ 1 0 5 2*10^5 2105,每個城鎮的最大值為 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} 2105109=21014。最大的 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 2109+109=3109。因此我們需要使用 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)