【发布时间】:2017-12-19 21:46:16
【问题描述】:
给你一个 T 天的时间线和 N 个分数的列表。您必须将每个分数分配给一天(从 1 到 T),以使分配的总分数最大化。
虽然有限制。每个分数只能分配给有限的天数 X,也可以分配给发生在特定数字 Y 上或之后的天数。
输入是给定的格式:
T
没有
分数 X Y(150 4 1 表示分数 150 最多可以分配到第 1 天或之后的 4 天)
例如:
T = 10
N = 5
150 4 1
120 4 3
200 2 7
100 10 5
50 5 1
注意 = 2 分数可以具有相同的值。每天最多可以分配1分。
上述示例的最佳结果是:150 150 150 150 120 120 200 200 120 120。
我尝试了什么:
我根据分数对列表进行排序,并首先分配最高分数。
在上面的示例中,我将从 200 开始并将其分配给 7 天和 8 天。
同样,我会将下一个最高分 150 分配给 1、2、3 和 4 天。 等等……
但这需要 O(N * T) 时间。 N 用于迭代分数列表,T 用于检查和分配时间线上的分数(在最坏的情况下)。
目标是最大化并计算最终得分。
有没有更优雅的方法来做到这一点?就像甚至没有分配分数,从而取消了 O(N * T) 的 T 部分。
【问题讨论】:
-
恕我直言,这太悲观了,因为大多数时候您只需要遍历 T 的一小部分。平均而言,您应该非常接近 O(T)
-
@MikeMB 你能解释一下原因吗? N 因子显然会因为对 N 个排序分数的迭代而出现
-
您对最小化算法的实际运行时间感兴趣吗?在这种情况下,如果您显示实际代码会有所帮助。
-
不,实际上我的算法会保证运行时间不好,所以这个问题的目的是找到另一种最佳方法来获得解决方案。由于我知道上述算法行不通,我仍在考虑各种方法,但没有编写任何方法
-
“不会工作” - 为什么? T 和 N 的上限是多少?您是否有指向原始问题/meaningufl 数据集的链接?我想测试一些想法。