题解 | #「土」巨石滚滚#
「土」巨石滚滚
https://ac.nowcoder.com/acm/problem/53681
一个超级贪心,最后一个情况没贪对 1:增加稳定的情况那么肯定是a小的先撞,反正都是增加所以先撞小的逐渐变大,才有机会撞大的; 2:稳定不变的随便撞 3:稳定减小的 分析:因为从头到尾收到的伤害总和是一定的,所以应该把回复多的放到前面才有能力撞下一个
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 500010;
int n ;
long long m;
int T;
struct node
{
int a , b , c;
}h[N];
bool cmp1(node u , node v)
{
return u.c > v.c;
}
bool cmp2(node u , node v)
{ return u.a < v.a;
}
bool cmp3(node u , node v)
{
return u.b > v.b;
}
int main()
{
cin >> T;
while(T--)
{
memset(h , 0 , sizeof h);
cin >> n >> m;
int cnt = 0;
for(int i = 1 ;i <= n;i ++)
{
int a , b;
cin >> a >> b;
int z = b - a;
if(z > 0) cnt ++;
h[i] = {a , b , z};
}
sort(h + 1,h + 1 + n , cmp1);
sort(h + 1 ,h + 1 + cnt , cmp2);
sort(h + 1 + cnt , h + 1 + n , cmp3);
int flag = 0;
// for(int i = 1 ;i <= n;i ++) cout<<h[i].a<<" "<<h[i].b<<" "<<h[i].c<<endl;
for(int i = 1 ;i <= n;i ++)
{
m -= h[i].a;
if(m < 0)
{
flag = 1;
break;
}
m += h[i].b;
}
if(!flag) cout << "Yes" << endl;
else cout <<"No" << endl;
}
}