zoukankan      html  css  js  c++  java
  • hdu 3177 Crixalis's Equipment(贪心)

    Problem Description
    Crixalis - Sand King used to be a giant scorpion(蝎子) in the deserts of Kalimdor. Though he's a guardian of Lich King now, he keeps the living habit of a scorpion like living underground and digging holes.

    Someday Crixalis decides to move to another nice place and build a new house for himself (Actually it's just a new hole). As he collected a lot of equipment, he needs to dig a hole beside his new house to store them. This hole has a volume of V units, and Crixalis has N equipment, each of them needs Ai units of space. When dragging his equipment into the hole, Crixalis finds that he needs more space to ensure everything is placed well. Actually, the ith equipment needs Bi units of space during the moving. More precisely Crixalis can not move equipment into the hole unless there are Bi units of space left. After it moved in, the volume of the hole will decrease by Ai. Crixalis wonders if he can move all his equipment into the new hole and he turns to you for help.
     
    Input
    The first line contains an integer T, indicating the number of test cases. Then follows T cases, each one contains N + 1 lines. The first line contains 2 integers: V, volume of a hole and N, number of equipment respectively. The next N lines contain N pairs of integers: Ai and Bi.
    0<T<= 10, 0<V<10000, 0<N<1000, 0 <Ai< V, Ai <= Bi < 1000.
     
    Output
    For each case output "Yes" if Crixalis can move all his equipment into the new hole or else output "No".
     
    Sample Input
    2 20 3 10 20 3 10 1 7 10 2 1 10 2 11
     
    Sample Output
    Yes No
     

    题意:要搬一些装备进入洞穴,洞的空间为V,他有N件装备,每件装备需要Ai的空间摆放,并且在把装备搬入洞穴的时候,需要Bi空间,某件装备摆放完毕后,洞穴内减少Ai的体积,问是否能把所有装备都搬入洞穴,可以输Yes,不可以输出No

     

    思路:

    这题按Bi大小排序是不可以的。

    比如一组数据中 V = 22

    2件装备A1 = 19  B1 = 21

               A2 = 1   B2 = 20

    那么如果按B的大小从大到小排序,则先搬第一件,再搬第二件,那么就无法把2件装备都搬入洞穴,而如果先搬第二件物品,搬完后洞穴剩余空间还有21,可以再搬第一件物品,就可以把2个装备全部搬入洞穴。

     

    所以应该考虑瞬时最大体积。还是举原来这个例子,如果先搬第一件物品,再搬第二件物品,需要的瞬时空间最大为19+20 = 39,而先搬第二件物品再搬第一件物品,需要最大的瞬时空间为1+21 = 22

    所以要比较的是 A1 + B2 与 A2 + B1 的大小, 若A1 + B2 < A2 + B1 

    即 A1 - B1 < A2 - B2 则先搬第一个。所以按Ai - Bi排序即可。

     

     

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <string>
    #include <algorithm>
    using namespace std;
    #define maxn 1010
    int T, N, V;
    bool flag;
    struct Node{
        int a, b;
    }node[maxn];
    bool cmp(Node x, Node y){
        return (x.a - x.b) < (y.a - y.b);
    }
    int main(){
        scanf("%d", &T);
        while(T--){
            scanf("%d%d", &V, &N);
            for(int i = 1; i <= N; i++){
                scanf("%d%d", &node[i].a, &node[i].b);
            }
            sort(node+1, node+1+N, cmp);
            
            flag = true;
            for(int i = 1; i <= N; i++){
                if(node[i].b <= V){
                    V -= node[i].a;
                }
                else{
                    flag = false;
                    break;
                }
            }
            if(flag) printf("Yes
    ");
            else printf("No
    ");
            
        }
        
        return 0;
    }

     

     

     
     
  • 相关阅读:
    elasticsearch入门 (三 ik 分词器安装)
    elasticsearch入门(二 基础api实例)
    elasticsearch入门(一 基础搭建)
    mysql 错误代码 1045 解决
    信号强度概念
    c语言中,在结构体中如何将void *转存为具体需要的数据类型
    我的论文
    I2C 上拉电阻选择计算公式
    SD卡两种操作模式在项目中应用的比较
    2017 年 年会过后的感想
  • 原文地址:https://www.cnblogs.com/titicia/p/3879012.html
Copyright © 2011-2022 走看看