POJ3045--Cow Acrobats

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


你可能感兴趣的:(POJ3045--Cow Acrobats)