hdu 3177Crixalis's Equipment(貪心)

果7發表於2014-03-03

Crixalis's Equipment

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2286    Accepted Submission(s): 924


Problem Description
Crixalis - Sand King used to be a giant scorpion(蠍子) in the deserts of Kalimdor. Though he's a guardian of Lich King now, he keeps the living habit of a scorpion like living underground and digging holes.

Someday Crixalis decides to move to another nice place and build a new house for himself (Actually it's just a new hole). As he collected a lot of equipment, he needs to dig a hole beside his new house to store them. This hole has a volume of V units, and Crixalis has N equipment, each of them needs Ai units of space. When dragging his equipment into the hole, Crixalis finds that he needs more space to ensure everything is placed well. Actually, the ith equipment needs Bi units of space during the moving. More precisely Crixalis can not move equipment into the hole unless there are Bi units of space left. After it moved in, the volume of the hole will decrease by Ai. Crixalis wonders if he can move all his equipment into the new hole and he turns to you for help.
 

Input
The first line contains an integer T, indicating the number of test cases. Then follows T cases, each one contains N + 1 lines. The first line contains 2 integers: V, volume of a hole and N, number of equipment respectively. The next N lines contain N pairs of integers: Ai and Bi.
0<T<= 10, 0<V<10000, 0<N<1000, 0 <Ai< V, Ai <= Bi < 1000.
 

Output
For each case output "Yes" if Crixalis can move all his equipment into the new hole or else output "No".
 

Sample Input
2 20 3 10 20 3 10 1 7 10 2 1 10 2 11
 

Sample Output
Yes No
 

題目大意:開始有能量V,然後有n個障礙物,打敗第i個障礙物,需要bi的能量(V>=bi),打敗之後能量會減少ai(V=V-ai)。問你有沒有可能選擇一種順序方式,使得可以將所有障礙物都打敗,可以的話輸出yes,else輸出no.

        解題思路:開始是分了兩個陣列討論,按照bi排一遍,再按照ai排一遍,試了很多方法,一直WA,沒有想到利用策略來找關係。

假設有第i個障礙物與第j個障礙物。
如果先放i後放j那麼有
V>=bi,V>=ai+bj;
如果先放j後放i那麼有
        V>=bj,V>=aj+bi;

對上面的再分析,如果先放i後放j,那麼V>=bi,V>=ai+bj;並且下面的的式子不成立,但是V>=bj成立,所以有aj+bi>V
那麼可以得到aj+bi>ai+bj;即為bi-ai>bj-aj;
按照這個排序,然後依次處理即可。
詳見程式碼。

題目地址:Crixalis's Equipment

AC程式碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

struct nod
{
    int a;
    int b;
};
nod node[1005];

int cmp(nod p1,nod p2)
{
    if(p1.b-p1.a>=p2.b-p2.a) return 1;
    return 0;
}

int main()
{
    int tes;
    cin>>tes;

    int v,n,i;
    while(tes--)
    {
        cin>>v>>n;
        for(i=0;i<n;i++)
            cin>>node[i].a>>node[i].b;

        sort(node,node+n,cmp);

        int flag=0;
        for(i=0;i<n;i++)
        {
            if(node[i].b>v)
            {
                flag=1;
                break;
            }
            else
            {
                v-=node[i].a;
            }
        }

        if(flag==1) puts("No");
        else puts("Yes");
    }
    return 0;
}

/*
34
10 2
9 9
1 5

10 2
3 10
1 5

20 3
10 20
3 10
1 7

10 2
1 10
2 11

8 3
6 7
1 2
1 1

8 3
6 8
1 1
1 2
*/


相關文章