如何找到解决所有N问题所需的最短时间?

时间:2015-05-22 17:33:14

标签: algorithm dynamic-programming

我试图解决这个问题,但即使在几小时后我也无法解决 完全理解这个问题。我甚至无法上来 用任何蛮力技术。这是一个问题:

  

有N个成员和N个问题,每个成员必须准确解决   1个问题。只允许团队中的一名成员阅读   在任何人开始解决之前的问题陈述。

     

请注意,并非所有人都首先阅读了这些问题。所以,要解决   成员需要知道某些队友的陈述的问题   已经知道了。一旦知道问题,会员就有资格   向其他队友(一次一个队友)解释。您可以   假设解释(1或N个问题)将始终采用D.   分钟。在解释过程中,两个参与成员都不会   能够做任何其他事情。

     

问题有不同的难度级别。你可以认为它   将Ti分钟解决第i个问题,无论是哪个   成员解决了它。

     

鉴于团队的数据,他们的最短时间是多少   可以解决所有问题吗?

输入

N  D
2 100

T=[1 2]

Output

102
  

会员1可以在开始时间之前知道问题。他开始   比赛开始时向成员2解释问题。解释结束于   第100分钟。然后他们两个立即开始解决   问题并行。会员1在第101分钟解决了第1个问题   成员2在第102分钟解决了第2个问题。

解码此类问题并接近它的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

这让我想起了Huffman coding

我不确定以下方法是否最佳,但在实践中可能会给出一个很好的答案。

  1. 选择最简单的两个问题T0和T1,并将其替换为由时间D + max(T0,T1)组成的单个问题。
  2. 重复,直到您遇到一个问题
  3. 如果将问题存储在二进制堆中,可以在O(logN)中找到两个最简单的问题,因此总体而言这是O(NlogN)。

    实施例

    假设我们有1,3,4,6和D = 2.

    我们首先将1和3组合成2 + max(1,3)= 5。新名单是4,5,6

    然后我们将4和5组合成2 + max(4,5)= 7。新名单是6,7。

    然后我们将6和7组合成2 + max(6,7)= 9。

    这代表以下程序。

    t=0 A shares with B
    t=2 A starts problem 6, B shares with C
    t=4 B starts problem 4, C shares with D
    t=6 C starts problem 3, D starts problem 1
    t=7 D finishes
    t=8 A finishes, B finishes
    t=9 C finishes
    

答案 1 :(得分:2)

团队的每个成员(阅读问题的人除外) 必须听到问题。也就是说,问题必须告诉N - 1次。 对于N = 2,这可以在D分钟内完成, 在2 < N <= 4分钟内2D4 < N <= 8分钟内的3D等等。

如果N不是2的精确幂,那么有些人必须完成说明 这些问题至少比其他问题早D分钟。 提前完成的人可以继续工作 最困难的问题,为以后完成的人留下更容易的问题。

如果某些问题花费时间Ti > DN则不合适 你可能想拥有的2的幂或2的精确幂 有人停止告诉问题更多而不是D分钟前 最后一个问题告诉已经完成。

如果某些问题需要时间Ti > 2D,那么您可能需要考虑 让一些人停止讲述问题并开始真正开展工作 即使N的精确度为2,也会很快出现问题。

由于解决一个问题是在每个成员的关键路径中, 但告诉是多个成员&#39;关键路径, 在他们完成之前解决问题是没有意义的 他们将要解决所有问题。 每{{}}}分钟后知道问题的人数 告诉问题的人数增加了。 告诉问题的人数会增加 告诉他们的问题(也就是刚刚学会了问题的人数) 问题)减去当时开始处理问题的人数。

一个好的&#34;蛮力&#34;方法可能是对问题进行排序 困难;然后找出最后一个人听到的时间 如果没有人在此之前就开始研究那些问题; 找出最后一个人完成的时间; 然后尝试提前D分钟或D分钟开始出现问题, 或2D分钟等,但从不开始短跑 在长期运行之前的问题。

答案 2 :(得分:0)

问题陈述对于解释部分有些含糊不清。根据语句的解释方式,可以使用以下解决方案:

如果您认为可以在D分钟内解释N个问题,那么解释一个问题需要N/D分钟。让我们称之为Te,以便及时解释&#34;。解决问题i的时间是Ti,我们知道它等于i分钟。

因此,在比赛开始时,会员1(知道所有问题)向会员2解释问题N.这需要Te分钟。然后,成员2开始处理问题N(需要N分钟才能解决),成员1开始向成员3解释问题N-1。这一直持续到成员1向成员N解释问题2。此时,成员N开始处理问题2,成员1开始处理问题1。

让我们说有4个问题,4个团队成员和D=8。所以Te=2

Time    Description
 0      Member 1 begins explaining Problem 4 to Member 2
 2      Member 2 begins working on Problem 4
        Member 1 begins explaining Problem 3 to Member 3
 4      Member 3 begins working on Problem 3
        Member 1 begins explaining Problem 2 to Member 4
 6      Member 2 completes problem 4
        Member 4 begins working on Problem 2
        Member 1 begins working on Problem 1
 7      Member 3 completes Problem 3
        Member 1 completes Problem 1
 8      Member 4 completes Problem 2

这似乎是最佳解决方案,无论DN的值如何:安排它以便尽可能早地开始解决最长时间的问题。

我怀疑问题陈述是用其他语言给出的问题的英文翻译,或者可能是对最初用英语编写并翻译成其他语言的某些内容的重新翻译。因为如果这是原始的问题陈述,那么写作的人应该被禁止再次写问题。

答案 3 :(得分:0)

完成任何一项任务所需的时间似乎为C * D + T, where C is a positive integer less than N形式,并且必须考虑所有N-1提前期。假设我们犯了一个错误,最佳解决方案实际上应该有一个任务加上更长的提前期 - 所以有些C * D + Tj < C * D + Ti, where Ti < Tj,这是不可能的。

因此,在对的总和上迭代一次(假设已排序的输入):

solution = maximum (T2 + (n-1) * D, T3 + (n-2) * D...D + Tn)