题目大意:有N头牛要玩叠罗汉....每头牛有两个属性,重量值weight和强壮值strength。每头牛的倒塌风险为它上方所有牛的重量和-它自己的强壮值。求如何叠,使得所有牛中风险最大的要最小。
分析:贪心。w+s越大,就放在越下面。假设现在是最优放置,最下面一头牛记作第一头牛(w1,s1),它上面的一头牛记作第二头牛(w2,s2),且w1+s1>=w2+s2。第二头牛上方的重量之和为sum。那么现在第一头牛的风险值为sum+w2-s1,第二头牛的风险值为sum-s2,如果我们将这两头牛互换位置,那么第二头牛的风险值就变为了sum+w1-s2,第一头牛的风险值变为了sum-s1,由于是最优放置,那么w2-s1<=w1-s2,也就是w1+s1>=w2+s2,与假设相符。
另外n=1时,答案不是0,而是-s1......
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 55555;
struct Cow{
int w, s;
bool operator <(const Cow & cmp) const{
return w+s < cmp.w+cmp.s;
}
}cow[maxn];
int n;
int main() {
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; i++)
scanf("%d%d", &cow[i].w, &cow[i].s);
sort(cow+1, cow+n+1);
int ans = -(1 << 29);
int sum = 0;
cow[0].w = 0;
for(int i = 1; i <= n; i++) {
sum += cow[i-1].w;
ans = max(ans, sum-cow[i].s);
}
printf("%d\n", ans);
}
return 0;
}