農民約翰的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;
}