本题的关键在于找到移动东西所需的最大瞬时体积,按此降序排列即可。
#include <iostream>
#include <cstdio>
#include <utility>
#include <algorithm>
using namespace std;
bool cmp(pair<int,int> A, pair<int,int> B)
{
return A.first + B.second < B.first + A.second;
}
/*对于一个A1,B1和A2,B2 如果我先搬前者再搬后者,那么所需空间为 A1+B2 (最大瞬时体积),反过来则是max(B2,A1+B1),因此我们根据差值贪心*/
int main()
{
int T;
cin >> T;
while( T-- )
{
pair<int,int> ins[1010];
int V,n;
cin >> V >> n;
for(int i = 0; i < n ; i++) cin >> ins[i].first >> ins[i].second;
sort(ins,ins+n,cmp);
bool f = true;
for(int i = 0; i < n; i++)
{
if(V < ins[i].second )
{
cout << "No\n";
f = false;/*最开始写的return 0;我说怎么老WA。。*/
}
else
{
if(V >= ins[i].second )
{
V -= ins[i].first;
}
}
}
if(f) cout << "Yes\n";
}
return 0;
}