题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3177
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.2 20 3 10 20 3 10 1 7 10 2 1 10 2 11
Yes No
题意:
向一个容量为V的洞中放如入物品,每件物品有一个停放体积和一个可移动体积,问能否放下所有的物品?
思路:—— 贪心
停放体积 移动体积
第一件物品 a1 b1
第二件物品 a2 b2
假设这两件物品的移动体积都不大于洞的体积V
那么将单独比较两个物品的时候会发现: a1+b2为先放第一件物品,后放第二件物品的最大瞬时体积
a2+b1为先放第二件物品,后放第一件物品的最大瞬时体积
那么我们就应该选择a1+b2和a2+b1中比较小的先放。
那么从2件物品,扩展到n件物品 假设n件物品的移动体积都不大于洞的体积V,
将N件物品按照a1+b2 < a2+b1进行排序,(其实就是按照差值的大小)然后依次放入洞中。
PS:
如果只是单纯的按照Bi从大到小排序的话为WA;
看看这个案例就明白了!
21 2
8 18
1 20
Yes
代码如下:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
struct num
{
int a, b;
} p[1017];
bool cmp(num A, num B)
{
return A.b-A.a > B.b-B.a;
}
int main()
{
int t;
int v, n;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&v,&n);
for(int i = 0; i < n; i++)
{
scanf("%d %d",&p[i].a,&p[i].b);
}
sort(p,p+n,cmp);
int i;
for(i = 0; i < n; i++)
{
if(v >= p[i].b)
{
v-=p[i].a;
}
else
break;
}
if(i == n)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
HDU 3177 Crixalis's Equipment(贪心)
原文地址:http://blog.csdn.net/u012860063/article/details/39346979