确切的问题陈述:
给定N
个任务,找到完成它们可以达到的最高点
问题限制:
完成T
任务需要N
分钟
可以随时提交解决方案,包括开始后T
分钟
i
- 在开始t
分钟后提交的任务将获得
maxPoints[i] - t * pointsPerMinute[i]
分
i
- 任务需要requiredTime[i]
分钟才能解决
输入格式
Line 1
:T
,完成的总分钟数
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
分
我能够通过置换和计算每个排列的点来获得解决方案。我无法找到优化的解决方案。
答案 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]。我们可以按此排序所有任务并计算答案。