*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的和从小到大排序贪心即可。
代码:
思路(转自/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); } }
相关文章推荐
- Android_自定义View之跳动的loading
- 【leetcode】1. Two Sum
- hosts.allow和hosts.deny文件
- angularjs插值字符串
- accept阻塞
- Java查表法实现CRC32校验算法
- instancetype代替id进行实例化
- 解析AngularJS表达式
- leetcode227-Basic Calculator II(简单计算器的实现)
- 《LeetBook》leetcode题解(6): ZigZag Conversion[E]
- Spring框架之<context:property-placeholder />元素
- AngularJS控制器嵌套(作用域包含作用域)
- HTC V版M7解锁刷机笔记
- 一、runtime之元素认知(一)
- 器普.net语法V1.0发布
- $scope 的生命周期
- 虚拟交换和路由,一些用于实现交换和路由功能流行的开源软件
- Droid48计算机使用说明
- PHP 中如何正确统计中文字数
- 级联菜单导致的JSP页面异常