貪心推公式-耍雜技的牛

農民約翰的N頭奶牛(編號爲1..N)計劃逃跑並加入馬戲團,爲此它們決定練習表演雜技。

奶牛們不是非常有創意,只提出了一個雜技表演:

疊羅漢,表演時,奶牛們站在彼此的身上,形成一個高高的垂直堆疊。

奶牛們正在試圖找到自己在這個堆疊中應該所處的位置順序。

這N頭奶牛中的每一頭都有着自己的重量WiWi以及自己的強壯程度SiSi。

一頭牛支撐不住的可能性取決於它頭上所有牛的總重量(不包括它自己)減去它的身體強壯程度的值,現在稱該數值爲風險值,風險值越大,這隻牛撐不住的可能性越高。

您的任務是確定奶牛的排序,使得所有奶牛的風險值中的最大值儘可能的小。

思路:

把公共部分去掉

滿足這個等式,危險係數就會降低:

把牛的最大值從小到大排序,然後順便計算一下他的能力值,就能求出結果。

輸入格式

第一行輸入整數N,表示奶牛數量。

接下來N行,每行輸入兩個整數,表示牛的重量和強壯程度,第i行表示第i頭牛的重量WiWi以及它的強壯程度SiSi。

輸出格式

輸出一個整數,表示最大風險值的最小可能值。

數據範圍

1≤N≤500001≤N≤50000,
1≤Wi≤10,0001≤Wi≤10,000,
1≤Si≤1,000,000,0001≤Si≤1,000,000,000

輸入樣例:

3
10 3
2 5
3 3

輸出樣例:

2
//爲了使風險值的最大值最小,應該將牛按照W+S從小到大的順序從下往上排列。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

vector<int> sums;

bool cmp(int a, int b)
{
    return sums[a] < sums[b];
}

int main()
{
    int N, W, S;
    cin >> N;
    vector<int> Ws(N), Ss(N), ranks(N);
    sums.resize(N);
    for (int i = 0; i < N; i++) {
        cin >> W >> S;
        Ws[i] = W;
        Ss[i] = S;
        sums[i] = W + S;
        ranks[i] = i;
    }

    sort(ranks.begin(), ranks.end(), cmp);

    int res = -1000000000;
    int sum_W = 0;
    for (int i = 0; i < N; i++) {
        int cur_id = ranks[i];
        res = max(res, sum_W - Ss[cur_id]);
        sum_W += Ws[cur_id];
    }

    cout << res;

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章