hdu 3177
来源:互联网 发布:超声成像算法导论 pdf 编辑:程序博客网 时间:2024/06/06 03:50
题目大意:向体积为v的山洞中搬运n个物品,每个物品具有(a,b) 属性。其中a是停放体积,b是移动体积。输出这个山东是否能放下这n个物品
解题思路:
1)当前物品能否放进山洞取决于当前物品的的移动体积是否小于山洞当前的剩余体积。
2)对这些物品进行排序 按照顺序依次进入洞中 排序要尽可能使得所有的东西都能进入洞中
这是一个贪心的问题
停放体积 移动体积
第一件物品 a1 b1
第二件物品 a2 b2
假设这两件物品的移动体积都不大于洞的体积V
那么将单独比较两个物品的时候会发现 a1+b2为先放第一件物品 后放第二件物品的最大瞬时体积
a2+b1为先放第二件物品 后放第一件物品的最大瞬时体积
我们应该选择a1+b2和a2+b1中比较小的先放
那么从2件物品 扩展到N件物品 假设n件物品的移动体积都不大于洞的体积V(如果有大于的 那么结果必然是NO)
将N件物品按照a1+b2<a2+b1进行排序 然后依次放入洞中
3)也就是说,每次向山洞中放移动体积和停放体积最大的那个物品
代码如下:
/* * 3177_2.cpp * * Created on: 2013年8月10日 * Author: Administrator */#include <iostream>using namespace std;struct Node{int f;int l;};bool compare(Node a , Node b){return a.f + b.l < b.f + a.l;}int main(){int t;scanf("%d",&t);while(t--){int v , n;scanf("%d%d",&v,&n);int i;Node nodes[n];for(i = 0 ; i < n ; ++i){scanf("%d%d",&nodes[i].f,&nodes[i].l);}sort(nodes,nodes+n,compare);bool flag = true;for(i = 0 ; i < n ; ++i){if(nodes[i].l > v){printf("No\n");flag = false;break;}else{v -= nodes[i].f;}}if(flag){printf("Yes\n");}}}
- hdu-3177
- HDU 3177
- hdu 3177
- hdu 1050+hdu 1789+hdu 3177(贪心)
- hdu 3177贪心
- hdu 3177_贪心
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- C#中属性和方法的区别
- hadoop 用命令行编译URLCat
- Android的读写文件及权限设置
- JavaScript高级程序设计_1~6章的练习
- iOS获得当前的firstResponder
- hdu 3177
- C#连接SQL server2008数据库
- 字符串常量指针在头文件中定义初始化与源文件中定义并初始化的区别
- C语言中的小秘密
- [poj 2411]Mondriaan's Dream[状态压缩DP]
- 快速排序及其应用
- 《数据通信与网络》笔记--TCP
- zoj 1610 Count the Colors【暴力乱搞】
- CF 336C(Vasily the Bear and Sequence-贪心-不满足单调性)