我有以下问题:
- 假设有 n 个项目。
- 让 Fi(x) 等于如果您在项目 i 上花费 x 单位时间将获得的点数。
- 你有 T 个单位的时间来使用和处理你想要的任何项目。
目标是最大化您将获得的积分数量,并且 F 函数不递减。
F 函数的边际收益递减,换句话说,在一个特定项目上花费 x+1 单位时间所获得的总积分增加少于在该项目上花费 x 单位时间所获得的总积分增加。
我想出了以下 O(nlogn + Tlogn) 算法,但我应该找到一个在 O(n + Tlogn) 中运行的算法:
sum = 0
schedule[]
gain[] = sort(fi(1))
for sum < T
getMax(gain) // assume that the max gain corresponds to project "P"
schedule[P]++
sum++
gain.sortedInsert(Fp(schedule[P] + 1) - gain[P])
gain[P].sortedDelete()
return schedule
也就是说,对初始增益数组进行排序需要 O(nlogn) 并且需要 O(Tlogn) 才能运行循环。我对这个问题的思考比我愿意承认的要多,并且无法提出可以在 O(n + Tlogn) 中运行的算法。