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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM