题意就是要把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