每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
3 3 1 100 10 1000 1000000000 1001 9 10 1000000000
100 1000 1001
有没有大佬帮忙看下,为什么测试用例能通过,但是提交了就不行,只有10%,
j = [] while True: try: s = input() s = s.split() j.append(s) if s == '': break except: break if j == '': print(0) z = [] for i in j: z.append([int(c) for c in i]) dic = z[0:-1] peop = z[-1] d = dict(dic) temp = 0 for i in peop: for j in sorted(d): if j > i: break if d[j] > temp: temp = d[j] print(temp) temp = 0
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)(2146)#放最大的进去
job=sorted(DP.items(),key=lambda x:x[0])#对工作按要求从小到大排序
A=enumerate(map(int,lines[-1].strip().split()))(2147)#组合成一个索引序列 方便输出
A=sorted(A,key=lambda x:x[1])
N=len(job)
M=len(A)
maxv=0
index=0
res=[0]*M
for i in range(N):
while job[i][0]>A[index][1]:#工作难度大的情况,定价并不断往后找人
res[A[index][0]]=maxv
index+=1
if index>=M:(2148)#出while循环
break
if index>=M:#出大循环
break
if maxv<job[i][1]:
maxv=job[i][1]
for i in range(index,M):(2149)#能力太高的也只能给max了
res[A[i][0]]=maxv
for i in res:
print(i)
import sys input_line = sys.stdin.readline().strip().split() N = int(input_line[0]) M = int(input_line[1]) job = [] i = 0 while i < N: input_line = sys.stdin.readline().strip().split() if input_line: job.append(list(map(int,input_line))) i += 1 people = [] while len(people) != M: input_line = sys.stdin.readline().strip().split() people = list(map(int,input_line)) #按照难度要求升序排列 job = sorted(job,key = lambda x:x[0]) #对工作进行预处理加快速度 pay = [] pay.append(job[0]) for Di, Pi in job: if Pi > pay[-1][1]: pay.append([Di,Pi]) #对M个结果打印输出 b = len(pay) for i in range(M): if people[i] < pay[0][0]: print(0) continue #二分查找,找到最后一个小于等于people[i]的位置 l = 0 r = b - 1 while l < r: m = 1 + (l + r) // 2 if pay[m][0] > people[i]: r = m - 1 else: l = m print(pay[l][1])
都没Python AC代码 在这里添加一个 思想还是借鉴最高票 用maps[key]表示能力值为key所能取得的最高报酬 代码如下:
import sys
def main():
lines = sys.stdin.readlines()
lines = [l.strip().split() for l in lines if l.strip()]
n, m = int(lines[0][0]), int(lines[0][1])
res = [0] * (n + m)
abilities = list(map(int, lines[-1]))
maps = dict()
for index, l in enumerate(lines[1:-1]):
d, s = int(l[0]), int(l[1])
maps[d] = s
res[index] = d
for index, ability in enumerate(abilities):
res[index + n] = ability
if ability not in maps:
maps[ability] = 0
res.sort()
maxSalary = 0
for index in range(n + m):
maxSalary = max(maxSalary, maps[res[index]])
maps[res[index]] = maxSalary
for index in range(m):
print(maps[abilities[index]])
if __name__ == '__main__':
main()