题目描述
帕秋莉掌握了一种土属性魔法
她使用这种魔法建造了一个大型的土球,并让其一路向下去冲撞障碍
土球有一个稳定性x,如果x < 0,它会立刻散架
每冲撞一个障碍,土球会丧失ai的稳定性,冲撞之后,又会从障碍身上回馈bi的稳定性
帕秋莉想知道,如果合理的安排障碍的顺序,在保证土球不散架的情况下,是否可以将障碍全部撞毁呢?
输入描述:
输入一个整数T,代表T组数据,每组数据中: 前一行两个整数n , m,表示障碍个数和土球的稳定性 接下来一行两个整数,分别表示障碍的ai和bi
输出描述:
若可以,输出“Yes”(不含引号),否则输出“No”(不含引号)
示例1
输入
1 5 50 49 49 52 0 5 10 26 24 70 70
输出
No
备注:
Σn <= 500000, 1<=m<=100000,0<=a,b<=100000
思路
一道贪心题,关键是写好排序规则。如果两个都是回复的,那么把那个伤得少的排在前面,否则可能没命去吃后面回复的了。如果两个都是损伤的,那选回复得多的,搏一搏是吧,反正都是死。如果一个损伤一回复,肯定把回复的放在前面先苟一手对吧。注意生命值开long long因为可能疯狂回疯狂回爆int!!!(80%)
代码
//「土」巨石滚滚(思维 贪心) #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N = 5000010; struct S { int a; int b; bool operator < (const S t)const { if(b > a && t.b > t.a) return a < t.a; if(b < a && t.b < t.a) return b > t.b; return b - a > t.b - t.a; } }; S s[N]; int main() { int t , i; scanf("%d" , &t); while(t--) { ll n , x; scanf("%lld %lld" , &n , &x); for(int i = 0 ; i < n ; i++) scanf("%d %d" , &s[i].a , &s[i].b); sort(s , s + n); for(i = 0 ; i < n ; i++) { x -= s[i].a; if(x < 0) break; x += s[i].b; } printf("%s\n" , i == n ? "Yes" : "No"); } return 0; }