NC53681 土巨石滚滚 贪心

链接: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

N N N个怪物,每个打第 i i i个怪要扣 A i A_i Ai血,打完后可以恢复 B i B_i Bi
初始血量 M M M,要求找到一条打怪路线,能打完所有怪物

  • N个怪分两批打
    • 第一批 : 正收益的怪, 优先打扣血少的(反正打完后能恢复更多血)
    • 第二批 : 负收益的怪, 优先打回血多的怪(反正打谁都要扣血,还不如扣少点)

所以得到排序方式:

  • 先按收益从大到小排,然后就可以分成左右两部分(左边正收益,右边负收益)
  • 对左边(正收益部分)按 A i A_i Ai小到大排序
  • 对右边(负收益部分)按 B i B_i Bi大到小排序
  • O ( n ) O(n) O(n)扫一遍能打完最后一个,就输出 Y e s Yes Yes

注意 : 不开long long 死光光

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN (500005)
#define ll long long int
#define INF (0x7f7f7f7f)
#define int long long int
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \ do { \ cout << "\033[31;1m " << #x << " -> "; \ err(x); \ } while (0)
void err() { cout << "\033[39;0m" << endl; }

template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
#endif

int n, m, Q, K, an, bn; 

/** * 分两批撞: * 第一批 : 撞正收益的 优先撞花费小的 * 第二批 : 撞负收益的 优先撞回血大的 */
struct Node {
	int x, y, w;
} a[MAXN];

bool cmp1(Node& noa, Node& nob) { //按收益
	return noa.w > nob.w;
}

bool cmp2(Node& noa, Node& nob) { //正收益 优先撞花费小的
	return noa.x < nob.x;
}

bool cmp3(Node& noa, Node& nob) { //负收益 优先撞回血多的
	return noa.y > nob.y;
}

signed main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%lld ", &Q);
	while(Q--) {
		scanf("%lld %lld ", &n, &m);
		an = bn = 0;
		for(int i=1; i<=n; i++) {
			scanf("%lld %lld ", &a[i].x, &a[i].y);
			a[i].w = a[i].y - a[i].x;
			if(a[i].w >= 0) an ++;
		}
		sort(a+1, a+1+n, cmp1);
		sort(a+1, a+1+an, cmp2);
		if(an+1 < n)
			sort(a+1+an+1, a+1+n, cmp3);
		bool ok = true;
		for(int i=1; i<=n && ok; i++) {
			if(m < a[i].x) ok = false;
			m += a[i].w;
		}
		printf("%s\n", ok ? "Yes" : "No");
	}



#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}


全部评论

相关推荐

12-24 20:46
武汉大学 Java
点赞 评论 收藏
分享
12-02 21:34
中南大学 Java
我这边应该算是华为第一批开奖的了,还是要11月底才开,不过今年的流程整体比去年确实要开得早,这一点还是值得表扬的。然后华为也确实很有诚意,给我这样bg的硕鼠开了15a,并且base地还是在杭州,应该是buff拉满了,但凡其他公司开的没这个高,and对象没签上海,可能真选择成为华孝子了。虽然很有诱惑力,但是这个15a的offer里面确实还是有猫腻的:1.&nbsp;薪资构成是这样的,15a&nbsp;=&nbsp;(基本工资+绩效工资)*12&nbsp;+&nbsp;10w年终,虽然绩效工资hr说100%能拿满,年终大部分都能拿满,绩效工资能拿满我可能还选择相信,但10w年终还能拿满,这我就存疑了。反正看了一圈别家的公司报价都是报一般情况下能拿多少年终,比如美团0-6个月,就报3.5个月,但是华似乎是喜欢往最高了报,所以估计10w年终拿满应该也是极少数人。2.&nbsp;公积金只交5%,并且缴纳基数还只是按基本工资交的,这里看似每个月到手的钱变多了,但是总体算下来,可能一年比别家就少拿1-2w。3.&nbsp;月末周六要加班,可以选择调休或双倍加班费,并且平常应该也会加班,感觉不大会像hr说的124能8.30下班,35能5.30下班的,云计算bu强度应该还算比较好的,估计一般情况下9-9-5吧,但是不知道并入ict后会如何。4.&nbsp;还有相关的业务线,听说8,9月份云计算bu内部已经调整了一波,好像还要并入ict下面了,感觉未来的不确定性也比较大。5.&nbsp;华为的认可度应该比不过传统的互联网大厂,技术的前瞻性应该也比不过(个人看法)。6.&nbsp;培养和升职,感觉美团可能更有说法,毕竟见到过1年升L6的,甚至还有两年升L7的,对华为的了解相对较少,只知道华为可能相对稳定一些?毕竟4年一签?综上,还是决定放弃华,准备去团吧,自己选的路,希望不会后悔吧。
变形钢筋:这个薪资结构,年终奖是画大饼啊
OC/开奖
点赞 评论 收藏
分享
回家当保安:复旦✌🏻,佬你的简历感觉挺好的,寒假日常hc比较少。佬可以过完年之后再试试,日常实习hc比较充足
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务