算法題15 安排機器 牛客網,騰訊筆試題
鏈接:https://www.nowcoder.com/questionTerminal/42e7ff5c5696445ab907caff17fc9e15
來源:牛客網
小Q的公司最近接到m個任務, 第i個任務需要xi的時間去完成, 難度等級為yi。
小Q擁有n台機器, 每台機器最長工作時間zi, 機器等級wi。
對於一個任務,它只能交由一台機器來完成, 如果安排給它的機器的最長工作時間小於任務需要的時間, 則不能完成,如果完成這個任務將獲得200 * xi + 3 * yi收益。
對於一台機器,它一天只能完成一個任務, 如果它的機器等級小於安排給它的任務難度等級, 則不能完成。
小Q想在今天盡可能的去完成任務, 即完成的任務數量最大。如果有多種安排方案,小Q還想找到收益最大的那個方案。小Q需要你來幫助他計算一下。
輸入描述:
輸入包括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
輸入
1 2 100 3 100 2 100 1
輸出
1 20006
解題代碼:
# -*- 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))