题意就是要把n样体积为Ai的东西搬到总体积为v的洞里。但是第i样东西能搬进去的前提是
洞的剩余体积>=Bi(Bi>=Ai)。问是否能把所有东西都搬进去。
算法:
比赛时直接按Bi降序排。后来yy讲了以后顿悟。
设ai>aj,bi>bj。
如果先把Bi大的放进洞里,如果刚好ai很大,那么当剩下的空间小于Bj时,第j个物品就放不进去了。
但是如果先放第j个,那么如果剩下的空间足够大,则可以继续放入第i个物品。
例如: 20 2
10 15
1 12 答案是Tes,如果只按bi降序排则答案变为No。
所以不是单纯地只与Bi的值有关。仅考虑两个物品的情况得到排序准则。
如果先放i,那么两个物品都能放入所需最大的剩余空间为 ai+bj;
如果先放j,那么两个物品都能放入所需最大的剩余空间为 aj+bi.
那么, ai+bj>aj+bi的时候先放i.
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
#include<vector>
#include<map>
#include<cmath>
#include<cctype>
using namespace std;
struct node
{
int a,b;
}t[1010];
bool cmp(node x,node y)
{
return x.b+y.a>y.b+x.a;
}
int main()
{
int T,V,n;
scanf("%d",&T);
while(T--)
{
memset(t,0,sizeof(t));
scanf("%d%d",&V,&n);
for(int i=0;i<n;i++)
scanf("%d%d",&t[i].a,&t[i].b);
sort(t,t+n,cmp);
int sum=V,succ=0;
for(int i=0;i<n;i++)
{
if(t[i].b>sum)
{
succ=1;
break;
}
sum-=t[i].a;
}
if(!succ) puts("Yes");
else puts("No");
}
return 0;
}
hdu 3177 Crixalis's Equipment (贪心- - 排序),布布扣,bubuko.com
hdu 3177 Crixalis's Equipment (贪心- - 排序)
原文:http://blog.csdn.net/u012841845/article/details/20354597