题目大意:有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; }