题目描述:
小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。
输入描述:
输入的第一行为两个正整数T,n。T代表工作时长(单位h,0 < T < 100000),n代表工作数量(1 < n ≤ 3000)。 接下来是n行,每行包含两个整数t,w。t代表该项工作消耗的时长(单位h,t > 0),w代表该项工作的报酬。
输出描述:
输出小明指定工作时长内工作可获得的最大报酬。
示例1
输入:
40 3
20 10
20 20
20 5
输出:
30
解题思路:
挑选工作的优先级:
①单位时间工资高的优先
②在①一样的情况下,优先选择耗时长的(解释:如果总时长为40,(20,20)(40,40)的单位时间工资一样,如果选择时长20的工作,剩下的时间只能单位时间工资更低的工作,整体单位时间工资是小于1的;但如果选择时长40的工作,整体单位时间工资是1)
剩下没什么难度,就是用匿名函数来辅助排序
#华为机试,emo了#
time,n=map(int,input().split())
task=[list(map(int,input().split())) for i in range(n)]
task_order=sorted(task,key=lambda x:10000*x[1]/x[0]+x[0],reverse=True)
money=0
for i in range(n):
if time>0:
if time>=task_order[i][0]:
money+=task_order[i][1]
time-=task_order[i][0]
else:
continue
else:
break
print(money)