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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值