hdu 3177 Crixalis's Equipment 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3177
贪心小水
题目大意:以魔兽为背景,蝎王要搬家,将一些装备搬到一个新洞穴中,问能否都搬进去。over.
题目分析:参数有这么几个,洞穴总容量v、装备总数n、每件装备在洞穴中占的空间(永久空间)ai、装备进洞时所需空间(暂时空间)bi。
我们每次搬运想到就是使剩余的洞穴空间尽量大,当有两件物品时,有如下信息A a1 b1B a2 b2加入先搬A,则搬运过程中瞬间占用空间最大为a1+b2,如果先搬运B,则这一个瞬间最大占用体积为a2+b1,我们想使剩下的体积尽量大,所以我们选择min(a1+b2,a2+b1),如果先选A,则有a1+b2<a2+b1,即b1-a1>b2-a2,所以我们可以看出,应该先选搬运体积和本身体积差值最大的贪心,由此得到最优搬运顺序!
以下是代码:
#include <stdio.h>
#include <algorithm>
using namespace std;
struct node
{
int a,b;
}e[1005];
int cmp(node x,node y)
{
return x.b-x.a>y.b-y.a;
}
int main(int argc, char *argv[])
{
int t;
while(scanf("%d",&t)!=EOF)
{
for(int i=0;i<t;i++)
{
int v,n,flag=0;
scanf("%d%d",&v,&n);
for(int j=0;j<n;j++)
{
scanf("%d%d",&e[j].a,&e[j].b);
}
sort(e,e+n,cmp);
for(int j=0;j<n;j++)
{
//printf("*** %d ***\n",v-e[j].b);
if(v-e[j].b<0)
{
flag=1;
break;
}
//printf("*** %d ***\n",v-e[j].a);
if((v-=e[j].a)<0) //在这里卡了一下 内括号很重要
{
flag=1;
break;
}
//printf("*** %d ***\n",v);
}
if(flag)printf("No\n");
else printf("Yes\n");
}
}
return 0;
}
PS:代码不难写,思路有点绕。只要想出b2-b1>a2-a1排序,后面就都迎刃而解了。