「土」巨石滚滚(思维 贪心)
「土」巨石滚滚
https://ac.nowcoder.com/acm/problem/53681
题目描述
帕秋莉掌握了一种土属性魔法
她使用这种魔法建造了一个大型的土球,并让其一路向下去冲撞障碍
土球有一个稳定性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;
} 牛客算法竞赛入门课第一节习题题解 文章被收录于专栏
入门课第一节习题题解
查看5道真题和解析
韶音科技公司氛围 647人发布