您的位置:首页 > 其它

*hdu4269 (贪心)

2016-04-10 00:16 134 查看
题意:有n个板,每个板有重量和强度两个属性,把板叠在一起,对于每个板有个PDV值,计算方式为这个板上面的板的重量和减去这个板的强度,对于每种叠放方式,取这个叠放方式中所以板中PDV值最大的值为代表值,问所有叠放方式中最小的代表值为多少。

思路(转自/article/5108639.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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: