zoukankan      html  css  js  c++  java
  • hdu 3177

    题目大意:向体积为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
    ");
    				flag = false;
    				break;
    			}else{
    				v -= nodes[i].f;
    			}
    		}
    
    
    		if(flag){
    			printf("Yes
    ");
    		}
    
    	}
    }
    



  • 相关阅读:
    【Java Web开发学习】Spring加载外部properties配置文件
    【Java Web开发学习】Spring4整合thymeleaf视图解析
    快速入门系列--MVC--06视图
    快速入门系列--WebAPI--03框架你值得拥有
    快速入门系列
    iOS 自己封装的网络请求,json解析的类
    iOS 本地通知
    iOS8 自定义navigationItem.titleView
    iOS8 UICollectionView横向滑动demo
    基于Spring开发
  • 原文地址:https://www.cnblogs.com/james1207/p/3262964.html
Copyright © 2011-2022 走看看