每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量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()