【发布时间】:2015-09-08 18:09:15
【问题描述】:
确切的问题陈述:
给定N 任务,找出完成它们可以达到的最大点数
问题约束:
完成N 任务需要T 分钟
可以随时提交解决方案,包括开始后的确切时间T 分钟
i-th 任务提交t 分钟后启动,会得到
maxPoints[i] - t * pointsPerMinute[i]积分
i-th 任务需要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分
我能够通过排列和计算每个排列的点来获得解决方案。我无法为此找到优化的解决方案。
【问题讨论】:
-
在一般的 NP-hard 问题中,检查maximum flow algorithm
-
穷举算法(检查所有排列)可以通过注意某些排列/排列从一开始(或至少很早)就不是最佳的来优化