admin管理员组

文章数量:1530034

题目大意:向一个容量为V的洞中搬物品 每件物品有一个停放体积 可一个移动体积 问能否放下这些物品

解题思路:对这些物品进行排序 按照顺序依次进入洞中 排序要尽可能使得所有的东西都能进入洞中

这是一个贪心的问题

停放体积 移动体积

第一件物品 a1 b1

第二件物品 a2 b2

假设这两件物品的移动体积都不大于洞的体积V

那么将单独比较两个物品的时候会发现 a1+b2为先放第一件物品 后放第二件物品的最大瞬时体积

a2+b1为先放第二件物品 后放第一件物品的最大瞬时体积

我们应该选择a1+b2和a2+b1中比较小的先放

那么从2件物品 扩展到N件物品 假设n件物品的移动体积都不大于洞的体积V(如果有大于的 那么结果必然是NO)

将N件物品按照a1+b2<a2+b1进行排序 然后依次放入洞中

// hdu 3177 贪心-好
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <algorithm>

using namespace std;
const int N = 1005;

struct node {
    int x1, x2; // x2 代表总和;
}t[N];

bool cmp(const node a, const node b) {
    return (a.x2 - a.x1) > (b.x2 - b.x1);
}

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        int V, n, i, flag = 0;
        scanf("%d%d", &V, &n);
        for(i = 0; i < n; i++) {
            scanf("%d%d", &t[i].x1, &t[i].x2);
            if(t[i].x2 > V) flag = 1; // 代表不能放下 
        }
        if(flag) {
            printf("No\n");
            continue;
        }
        sort(t, t+n, cmp);
        int sum = V - t[0].x1;
        for(i = 1; i < n; i++) {
            if(t[i].x2 > sum) {
                flag = 1;
                break;
            }
            sum -= t[i].x1;
        }
        if(flag) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
    system("pause");
}
        
        
        
        
        
        
        
        
        
        
        
        


 

本文标签: 很好hduCrixalisgreedyequipment