2012 成都网络赛I题 Buildings

题意:每层楼都有一个重量W一个强度S,每一层楼的潜在伤害值等于 (Σwj)-si,其中 (Σwj)表示第i楼以上的所有楼层的重量之和。

求如何摆放使得最大伤害值最小。


题解:首先要确定两层楼之间要怎样调整才能使结果最小->考虑任意相邻的两层楼->任意不相邻的两层楼->得到贪心策略。

交换顺序之前:PDV1 = Wtop - Si;  PDV2 =Wtop + Wi - Sj    (i上,j下)

交换顺序之后:PDV1= Wtop - Sj;  PDV2 = Wtop + Wj - Si    (j上,i下)

如果交换顺序之后结果更小,则满足 max(Wtop-Si, Wtop+Wi-Sj) > max(Wtop-Sj, Wtop+Wj-Si)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct NODE { int w, s; } a[200000];

int cmp(const void *p1, const void *p2)
{
    NODE *p3 = (NODE*)p1;
    NODE *p4 = (NODE*)p2;
    int w1 = p3->w, s1 = p3->s;
    int w2 = p4->w, s2 = p4->s;
    return max(-s1, w1 - s2) - max(-s2, w2 - s1);
    //return (w1+s1) - (w2+s2);
}



int main()
{
    int N;

    while(scanf("%d",&N) != EOF)
    {
        for(int i = 0; i < N; i++)
            scanf("%d%d", &a[i].w, &a[i].s);
        qsort(a, N, sizeof(NODE), cmp);

        __int64 topSum = 0, res = 0;
        for(int i = 1; i < N; i++)
        {
            topSum += a[i-1].w;
            res = max(res, topSum - a[i].s);
        }
        printf("%I64d\n",res);
    }
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值