*hdu4269 (贪心)

本文探讨了板叠放问题的求解策略,通过贪心算法找到所有叠放方式中最小的代表值。算法依据板的重量和强度进行排序,采用排序后从最小PDV值开始累加重量的策略,最终得出最小代表值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:有n个板,每个板有重量和强度两个属性,把板叠在一起,对于每个板有个PDV值,计算方式为这个板上面的板的重量和减去这个板的强度,对于每种叠放方式,取这个叠放方式中所以板中PDV值最大的值为代表值,问所有叠放方式中最小的代表值为多少。
思路(转自http://www.cnblogs.com/wally/archive/2013/06/01/3113008.html)假设i,j相邻,并且i上面的重量为sum,若i在上面,则有pi=sum-si,pj=sum+wi-sj;若j在上面,则有pi’=sum+wj-si,pj’=sum-sj;
显然有pi < pi’,pj>pj’,于是令pj < pi’(就是i在j上面要比j在i上面PDV要小),就需要满足sum+wi-sj < sum+wj-si,即wi+si< wj+sj; 所以按si+wi的和从小到大排序贪心即可。
代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
#define max(x,y) (x>y?x:y)
struct node
{
    int x,y;
}map[100005];
bool cmp(const node a,const node b)
{
    return a.x+a.y<b.x+b.y;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i;
        for(i=0;i<n;i++)
            scanf("%d%d",&map[i].x,&map[i].y);
        sort(map,map+n,cmp);
        __int64 sum=0,s=0;
        for(i=0;i<n;i++)
        {
            sum=max(sum,s-map[i].y);
            s=s+map[i].x;
        }
        printf("%I64d\n",sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值