从n个任务中找出最大值

时间:2015-09-08 18:09:16

标签: algorithm task

确切的问题陈述:

给定N个任务,找到完成它们可以达到的最高点

问题限制

完成T任务需要N分钟

可以随时提交解决方案,包括开始后T分钟

i - 在开始t分钟后提交的任务将获得 maxPoints[i] - t * pointsPerMinute[i]

i - 任务需要requiredTime[i]分钟才能解决

输入格式

Line 1T,完成的总分钟数

Line 2:以逗号分隔的maxPoints

列表

Line 3:以逗号分隔的pointsPerMinute

列表

Line 4:以逗号分隔的requiredTime

列表

示例输入

75

250 500 1000

2 4 8

25 25 25

示例输出

1200

解释

首先,在比赛开始后的25分钟内解决第三项任务。获取1000 - 8 * 25 = 800

第二,在比赛开始后的50分钟解决第二个任务。获取500 - 4 * 50 = 300

第三,在比赛开始后解决第一个任务75分钟。获取250 - 2 * 75 = 100

总计获得800 + 300 + 100 = 1200

我能够通过置换和计算每个排列的点来获得解决方案。我无法找到优化的解决方案。

1 个答案:

答案 0 :(得分:0)

我使用贪心算法来解决这个问题。

我使用m代表maxPoint,p代表pointsPerMinute,r代表requiredTime。

考虑在B任务之前完成任务,你可以得到: 点(A,B)= m [A] - p [A] * r [A] + m [B] - p [B] *(r [A] + r [B])

在A任务之前完成B任务,您可以获得: 点(B,A)= m [B] - p [B] * r [B] + m [A] - p [A] *(r [A] + r [B])

如果你应该在B任务之前完成A任务,Point(A,B)需要大于Point(B,A),所以Point(A,B) - Point(B,A)> = 0。

对于某些计算,我们可以得到:

r [A] / p [A]< r [B] / p [B]。

这意味着,如果我们需要在B任务之前完成A任务,r [A] / p [A]应该小于r [B] / p [B]。我们可以按此排序所有任务并计算答案。