题目链接:登录—专业IT笔试面试备考平台_牛客网
题目描述
帕秋莉掌握了一种土属性魔法
她使用这种魔法建造了一个大型的土球,并让其一路向下去冲撞障碍
土球有一个稳定性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
思路
题目的前提条件是在合理的安排障碍的顺序,因此本题采用贪心算法,先合理规划安排障碍顺序。首先分析题目可以将障碍分为两类:第一类是冲撞后的稳定性大于冲撞前的稳定性(ai<bi),第二类是冲撞后的稳定性小于冲撞前的稳定性(ai>bi)。将第一类的障碍放在第二类前是更加合理的,因为冲撞第一类障碍之后的稳定性是大于冲撞前,若第一类障碍稳定性小于0,则第二类障碍稳定性更小于0。大类分完之后开始分析小类:在第一类中,优先考虑丧失稳定性小的障碍,即对第一类障碍按照ai进行升序排序;在第二类中,优先考虑回馈稳定性大的障碍,即对第二类障碍按照bi进行降序排序。注意:若在冲撞第一类障碍时已经无法维持稳定性,则不用再对第二类障碍进行冲撞,因此使用flag对第一类进行标记。
代码
第一段代码: 对数据进行存储以及处理。
T = int(input())
for _ in range(T):
n,m = map(int,input().split())
a = [] #存最后为增加稳定性的障碍
b = [] #存最后为减少稳定性的障碍
flag = 1
for _ in range(n):
ai,bi = map(int,input().split())
if bi - ai > 0:
a.append((ai,bi,bi - ai))
else:
b.append((ai,bi,bi - ai))
a.sort()
b.sort(key = lambda x:-x[1])
第二段代码: 将土球稳定性与冲撞障碍丧尸的稳定性(ai)进行比较和更新。
for x,y,z in a:
if m - x < 0:
print('No')
flag = 0
break
else:
m += z
if flag:
for x,y,z in b:
if m - x < 0:
print('No')
break
else:
m += z
else:
print('Yes')
完整代码如下。
T = int(input())
for _ in range(T):
n,m = map(int,input().split())
a = [] #存最后为增加稳定性的障碍
b = [] #存最后为减少稳定性的障碍
flag = 1
for _ in range(n):
ai,bi = map(int,input().split())
if bi - ai > 0:
a.append((ai,bi,bi - ai))
else:
b.append((ai,bi,bi - ai))
a.sort()
b.sort(key = lambda x:-x[1])
for x,y,z in a:
if m - x < 0:
print('No')
flag = 0
break
else:
m += z
if flag:
for x,y,z in b:
if m - x < 0:
print('No')
break
else:
m += z
else:
print('Yes')
回顾
对于这类题型还是要多分析题目意思,对题目进行全方面的剖析,避免遗漏某些情况导致出现问题。这道题还是比较简单的,所以没啥想法。主要还是希望自己能坚持下去,保持对代码的一个手感。