您的位置:首页 > 产品设计 > UI/UE

hdu 3177 Crixalis's Equipment (贪心- - 排序)

2014-03-03 08:27 399 查看
题意就是要把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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: