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


你可能感兴趣的:(2012 成都网络赛I题 Buildings)