HDU 4296 building

题意:

给出 n 个木板的重量值和长度 然后每个木板的PDV = 压在他上面的木板的重量值之和-该木板的长度值

求所有木板中PDV值最大的最小

给出一个 n 表示木板的数量

接下来 n 行表示每块木板的重量值和长度值

求PDV最大的最小

分析:

①如果排序为 a b 则a的PDV = sum-wb       b的PDV = sum+wa-sb

②如果排序为 b a 则b的PDV = sum-sb        a的PDV = sum+wb-sa

要想第一种方法要想最大值的PDV < 第二种方法最大值

则 wa+sa < wb+sb

所以排序然后找这种最优方法中的最大值

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    int w,s;
}q[100005];
int cmp(node a,node b)
{
    return a.w+a.s<b.w+b.s;
}
int main()
{
    int i,n;
    __int64 ans;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
            scanf("%d%d",&q[i].w,&q[i].s);
        sort(q,q+n,cmp);
        ans=0;
        __int64 sum=0;
        sum+=q[0].w;
        for(i=1;i<n;i++)
        {
            if(sum-q[i].s>ans)
                ans=sum-q[i].s;
            sum+=q[i].w;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

 

posted @ 2012-09-18 08:47  'wind  阅读(134)  评论(0编辑  收藏  举报