题目大意:向一个容量为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");
}