1
我有以下問題:貪心算法優化
- 讓那裏是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)。
我不知道在線性時間內構建最小/最大堆的能力;非常感謝,這允許我的案例1的解決方案在O(n + TlogN)中運行。 –