算法題15 安排機器 牛客網,騰訊筆試題python
連接:https://www.nowcoder.com/questionTerminal/42e7ff5c5696445ab907caff17fc9e15
來源:牛客網算法
小Q的公司最近接到m個任務, 第i個任務須要xi的時間去完成, 難度等級爲yi。
小Q擁有n臺機器, 每臺機器最長工做時間zi, 機器等級wi。
對於一個任務,它只能交由一臺機器來完成, 若是安排給它的機器的最長工做時間小於任務須要的時間, 則不能完成,若是完成這個任務將得到200 * xi + 3 * yi收益。 app
對於一臺機器,它一天只能完成一個任務, 若是它的機器等級小於安排給它的任務難度等級, 則不能完成。 python2.7
小Q想在今天儘量的去完成任務, 即完成的任務數量最大。若是有多種安排方案,小Q還想找到收益最大的那個方案。小Q須要你來幫助他計算一下。 spa
輸入包括N + M + 1行,
輸入的第一行爲兩個正整數n和m(1 <= n, m <= 100000), 表示機器的數量和任務的數量。
接下來n行,每行兩個整數zi和wi(0 < zi < 1000, 0 <= wi <= 100), 表示每臺機器的最大工做時間和機器等級。
接下來的m行,每行兩個整數xi和yi(0 < xi < 1000, 0 <= yi<= 100), 表示每一個任務須要的完成時間和任務的難度等級。
輸出兩個整數, 分別表示最大能完成的任務數量和獲取的收益。
1 2 100 3 100 2 100 1
1 20006
解題代碼:code
# -*- coding:utf-8 -*- #python2.7 n,m=[int(i) for i in raw_input().strip().split()] machines,tasks=[],[] for i in range(n): hours,level=[int(i) for i in raw_input().strip().split()] machines.append([hours,level]) for i in range(m): hours,level=[int(i) for i in raw_input().strip().split()] tasks.append([hours,level]) machines.sort(key=lambda x: (x[0],x[1]),reverse=True) tasks.sort(key=lambda x: (x[0],x[1]),reverse=True) dp=[0 for i in range(101)] j=0 count=0 res=0 for tktime,tklev in tasks: while j<len(machines) and machines[j][0]>=tktime: dp[machines[j][1]]+=1 j+=1 for i in range(tklev,101): if dp[i]>0: dp[i]-=1 res += 200*tktime+3*tklev count+=1 break print("%d %d" %(count,res))