1373: Crixalis's Equipment

Time Limit: 1 Sec  Memory Limit: 128 MB

[​​Submit​​​][​​Status​​​][​​Web Board​​]

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

【分析】

题意:有n个物品,要运进一个体积为v的洞里,每个物体有本身的体积ai和移动是需要的体积bi,也就是说,只有当洞的剩余体积大于等于bi时才能把这个物品运进洞里,但是在运进去之后它只占ai的体积,问能不能把所有物品运进洞里


假设有两件物品 a(1,7)、b(5,10)先搬 a 再搬 b 则需要洞的的体积是max(7,1+10)=11 ,反过来就是max(10,5+7)=12
也就是说假设两件物品时a(x1,y1)、b(x2,y2)

所需要的洞的体积就是 min (max(y1, x1+y2),max(y2,x2+y1))
那么显然可以比较 x1+y2 与 x2+y1 的大小 假设 x1+y2 > x2+y1也就是y2-x2>y1-x1

那么显然比较的就是一个物品两个体积的差值,并且显然是先搬差值大的~所以题目就变成了一个sort的问题1

【代码】

#include <stdio.h>
#include <algorithm>
using namespace std;
struct xx{
int v1,v2,v3;
}a[2000];

int cmp(xx x,xx y){return x.v3>y.v3;}

int main()
{
int pp;scanf("%d",&pp);
while(pp--)
{
int v,n;scanf("%d%d",&v,&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].v1,&a[i].v2);
a[i].v3=a[i].v2-a[i].v1;
}
sort(a,a+n,cmp);
int t=1;
for(int i=0;i<n;i++)
if(v>=a[i].v2) v-=a[i].v1;
else
{
printf("No\n");
goto out;
}
printf("Yes\n");
out:;
}
return 0;
}