F - Crixalis's Equipment(贪心)
题意:给定个物品的体积
和能装下该物品的最小剩余容量
和背包体积
,问能否装下所有物品。
思路:贪心,因为要让所有物品能被装下,显然要为较大的留下更大的空间,又因为要使后面的物品也能被装下,腾出更多空间,所以
要尽可能地小,因此可以想到贪心的策略是
尽可能越大越好,这样既满足
大的同时
小,这里说几个错误的贪心策略。
越小越好,显然不对。
越大越好,这样显然是错的,如果该物品的
也很大,这样后面
较大的物品就装不下,
显然装了第二个物品后第一个物品就装不下了,但先装第一个物品,剩下的空间就够装第二个物品。
越大越好,这样显然也不行,因为这是相对大小,不是实际大小,
显然先装第一个物品剩余的空间不能满足更大的
.
时间复杂度:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e3+5;
#define mst(a) memset(a,0,sizeof a)
struct p{
int x,y;
}a[N];
bool cmp(p a,p b){
return a.y-a.x==b.y-b.x?a.y>b.y:a.y-a.x>b.y-b.x;
}
int n,t,v;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&v,&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp);
int ok=0,cnt=0;
for(int i=1;i<=n;i++){
if(v>=a[i].y&&v>=a[i].x){
v-=a[i].x;
cnt++;
}
}
if(cnt==n) puts("Yes");
else puts("No");
}
return 0;
}

京公网安备 11010502036488号