这是一道贪心的题,找出每头牛排序的方法是关键。
当一群牛堆叠起来的时候,从下往上每头牛的risk就是sum-w-s,因此按照w和s之和的大小进行排序即可。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 5*10e4;
const int min_risk = -10e9;
struct cow {
int w, s;
}cows[maxn];
bool comp(const cow& c1, const cow& c2) {
return c1.w + c1.s < c2.w + c2.s;
}
int main(int argc, char const *argv[]) {
int n;
scanf("%d", &n);
int sum = 0;
for (int i = 0; i < n; i++) {
int w, s;
scanf("%d%d", &cows[i].w, &cows[i].s);
sum += cows[i].w;
}
sort(cows, cows + n, comp);
int risk = min_risk;
for (int i = n - 1; i >= 0; i--) {
sum -= cows[i].w;
risk = max(risk, sum - cows[i].s);
}
printf("%d\n", risk);
return 0;
}