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排序,后面就都迎刃而解了。

本文探讨了魔兽背景下的蝎王搬家问题,详细分析了如何通过贪心算法来决定装备搬运顺序以充分利用洞穴空间。文章提供了具体代码实现,解释了排序规则和关键逻辑,帮助读者理解并解决类似资源分配问题。
409

被折叠的 条评论
为什么被折叠?



