题目大意:
山洞的体积为\(v\)
第\(i\)个物品放在山洞里会占据\(a_i\)的空间,在搬运过程中至少需要\(b_i\)的空间
问能不能把所有物品都放下
贪心题.比较难看出贪心,但是从无顺序要求中可以看出这是个贪心.
仍然考虑两个人.(贪心的基本操作)
如果不知道为什么考虑两个人可以参考我的另外两篇有关贪心交换的好题:国王游戏
皇后游戏
设第一个人的占据空间为\(a_1\),需要空间为\(b_1\)
然后就可以乱搞分析.
仍然的.
所用的空间.
max(max(b_1,a_1+b_2),max(b_2,a_2+b_1))是不能排在第一位的
首先\(b_1,b_2\)是不可能作为答案的.
\(a_1+b_2 a_2+b_1\)
两边同时减去\(b_1+b_2\)
成了
\(a_1-b_1,a_2-b1\)
如果\(a_1-b_1 > a_2-b1\)就让第一个人排在第一个位置.
反之同理.
#include <iostream>
#include <cstdio>
#include <algorithm>
const int maxN = 1000 + 7;
struct Node{
int a,b;
}Q[maxN];
int T,n,V;
bool operator < (const Node &a,const Node &p) {
return a.a - a.b < p.a - p.b;
}
bool cmp(int sum,int id) {
if(sum + Q[id].b > V) return false;
return true;
}
int main() {
scanf("%d",&T);
while(T --) {
scanf("%d%d",&V,&n);
for(int i = 1;i <= n;++ i)
scanf("%d%d",&Q[i].a,&Q[i].b);
std::sort(Q + 1,Q + n + 1);
int sum = 0;
bool flag = true;
for(int i = 1;i <= n;++ i) {
if(cmp(sum,i)) sum += Q[i].a;
else {
flag = false;
break;
}
}
flag ? puts("Yes") : puts("No");
}
return 0;
}