我有以下问题:
目标是最大化您将获得的积分数,且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)中运行的算法。
答案 0 :(得分:1)
对于第一种情况,使用堆,构建堆将花费O(n)时间,并且每个ExtractMin&amp; DecreaseKey函数调用将花费O(logN)时间。
对于第二种情况,构造一个nXT表,其中第i列表示情况T = i的解。第i + 1列应该仅取决于第i列和函数F上的值,因此可以在O(nT)时间内计算。我没有彻底考虑所有案例,但这应该给你一个良好的开端。