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