题目描述
125.耍杂技的牛
农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。奶牛们不是非常有创意,只提出了一个杂技表演:叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。这N头奶牛中的每一头都有着自己的重量Wi以及自己的强壮程度Si。一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。您的任务是确定奶牛的排序,使得所有奶牛的风险值中的最大值尽可能的小。
样例
cin>>
3
10 3
2 5
3 3
cout<<
2
算法1
(贪心) $O(n^2)$
让承受力和体重之和最小的牛放在上面。
时间复杂度
参考文献
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4;
typedef pair<int, int> PII;
PII cow[N];
int n, tmp = -1e9, sum = 0;
int main(void){
cin >> n;
for(int i = 0; i < n; i++){
int a, b;
cin >> a >> b;
cow[i].first = a + b;
cow[i].second = b;
}
sort(cow, cow + n);
for(int i = 0; i < n; i++){
sum -= cow[i].second;
tmp = max(tmp, sum);
sum += cow[i].first;
}
cout << tmp << endl;
return 0;
}