hdu3177: http://acm.hdu.edu.cn/showproblem.php?pid=3177
题意:向一个体积为V的洞搬进东西,物品体积为v[i].a,需要的移动体积为v[i].b,问能否全部搬进洞中
解法:贪心法:对于两件物品a1,b1;a2,b2,若先放1再放2,则V-a1>b2即V>a1+b2;若先放2再放1,则V-a2>b1即V>a2+b1,用贪心法可知要取a1+b2与a2+b1中较小者,即b-a大者先取
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct abc
{
int a,b;
}v[1200];
bool cmp(const abc x,const abc y)
{
return x.b-x.a>y.b-y.a;
}
int main()
{
int t,V,l,n,s;
scanf("%d",&t);
getchar();
while(t--)
{
l=0;
scanf("%d%d",&V,&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&v[i].a,&v[i].b);
if(v[i].a>V||v[i].b>V)
l=1;
}
if(l==1)
{
printf("No\n");
continue;
}
sort(v,v+n,cmp);
s=V;
for(int i=0;i<n-1;i++)
{
s=s-v[i].a;
if(v[i+1].a>s||v[i+1].b>s)
{
l=1;
break;
}
}
if(l==1)
printf("No\n");
else
printf("Yes\n");
}
}
/*input:
2
20 3
10 20
3 10
1 7
10 2
1 10
2 11
output:
Yes
No
*/