算法題15 安排機器 牛客網,騰訊筆試題

算法題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

輸入

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))
相關文章
相關標籤/搜索