Cow Acrobats POJ3045
投稿日: 更新日:
問題:http://poj.org/problem?id=3045
問題
匹の牛がいます。牛の重さは、強さはです。今、牛を縦に積み重ねます。この時、牛のリスクは上に乗っている牛の重さ(自分自身は含めない)の総和から自身の強さを引いた値です。リスクが最小になるように牛を積み重ねた時の最大のリスクを出力してください。
解法
牛とただしを考えます からまでの重さをとします。この時、を入れ替え無ければリスクは、入れ替えればとなります。を入れ替える方が良い場合というのは以下の式の場合です。
つまり、間に何匹牛がいるかは関係なく、であれば入れ替えた方が良いことが分かります。
実装
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Cow{
int w, s;
bool operator< (Cow b){
return b.w - s < w - b.s;
}
};
int main(){
int n;
cin >> n;
vector<Cow> ws(n);
for(int i = 0;i < n; ++i){
cin >> ws[i].w >> ws[i].s;
}
sort(ws.begin(), ws.end());
int sum = 0;
int ans = -1e9;
for(int i = n-1;i >= 0; --i){
ans = max(ans, sum - ws[i].s);
sum += ws[i].w;
}
cout << ans << endl;
return 0;
}