完整的题目说明在下面链接:2018网易-牛牛找工作
一、思路
一个很简单的想法是根据每个人的能力值与所有工作的难度进行比较,但时间复杂度为N * N,不能通过全部用例。
另一个想法是先将工作按照工作的难度进行排序,在将小伙伴按照能力的从小到大排序,依次获取难度满足小伙伴要求的工作的最大报酬。主要的进行的操作是排序,时间复杂度为N*log(N)。
二、相关操作
-
读取输入
之前我通常使用input()
函数作为数据的读入,input()
读入是以换行为结束标志,获得的字符串不会包括换行符,有多少行就需要进行多少次input()
操作。发现有人用sys库的sys.stdin.readlines()
进行读入,如下
lines = sys.stdin.readlines()
for line in lines:
#do some things#
pass
该函数会把标准输入的全部获取,包括换行符,需要ctrl+d
来结束输入,该函数需要注意一下几点
* 输入的最后必须是一个换行,否则不能停止输入
* 返回的是一个list,包含每行的输入字符串,每个字符串都以空格结尾
-
去除字符串首尾的指定字符
字符串的strip()
方法可以实现这个功能,默认是去除首尾的换行符。 -
字符串到整形的转换
一个很直接的方法是用for循环来对分割后的每个字符进行int()
转换,但一个更加简洁高效的方法是用map
函数来实现,这个函数需要两个参数,第一个参数是比变换的函数,第二个参数是可以迭代的对象。
[a,b] = map(int,line.strip().split())
-
字典的排序
字典具有去重的功能,去重后排序主要是利用sorted
函数,具体操作如下
cop=sorted(DP.items(),key=lambda x=x[0])
第一个参数是一个可迭代对象,第二个参数是一个函数,每个可迭代对象会结果函数处理后再进行比较
-
带索引的
list
排序
由于输出的结果通常有顺序的要求,对list
的排序希望能够保留相应的索引号。这里用到了enumerate
函数,该函数主要是将可迭代对象组合成一个索引序列,返回的是一个枚举对象。在利用sorted
函数对返回的对象进行排序。
A = enumerate(map(int,lines[-1].strip().split()))
cop = sorted(DP.items(),key = lambda x:x[0])
三、代码
通过全部用例的Python代码如下,需要注意的是输入用例包括无意义的空行,需要去除。
import sys
lines = sys.stdin.readlines()
DP = {}
for line in lines[1:-1]:
if not line.strip().split():
continue
[a,b] = map(int, line.strip().split())
DP[a] = max(DP.get(a,0),b)
cop = sorted(DP.items(),key = lambda x:x[0])
#读取每个人的能力值
A = enumerate(map(int,lines[-1].strip().split()))
A = sorted(A,key = lambda x:x[1])
maxvalue = 0
cpind = 0
M = len(A)
N = len(DP)
res = [0]*M
for i in range(N):
while cop[i][0]>A[cpind][1]:
res[A[cpind][0]] = maxvalue
cpind += 1
if cpind >= M:
break
if cpind >= M:
break
if maxvalue<cop[i][1]:
maxvalue = cop[i][1]
for i in range(cpind,M):
res[A[i][0]] = maxvalue
for i in res:
print(i)