在编程竞赛中需要有关问题集的帮助

时间:2013-10-18 17:37:39

标签: algorithm

我参加过我国的本地编程竞赛。比赛名称为“ACM-ICPC Indonesia National Contest 2013” 比赛于2013-10-13 15:00:00(GMT +7)结束,我仍然对其中一个问题感到好奇。
您可以找到问题的原始版本here

简要问题说明:
应该在几个“服务器”(计算机)上执行一组“作业”(任务) 每个作业应严格执行从开始时间S i 到结束时间E i
每台服务器一次只能执行一项任务 (这里很复杂)服务器从一个作业切换到另一个作业需要一些时间 如果服务器完成作业J x ,那么要启动作业J y ,它将需要在作业J x,y > x 完成。这是服务器清理作业J x 和加载作业J y 所需的时间。
换句话说,作业J y 可以在作业J x 之后运行当且仅当E x + T x,y < / sub>≤S y

问题是计算完成所有工作所需的最小服务器数量。

示例:
例如,让3个工作

S(1) =  3 and E(1) =  6
S(2) = 10 and E(2) = 15
S(3) = 16 and E(3) = 20
T(1,2) = 2,  T(1,3) = 5
T(2,1) = 0,  T(2,3) = 3
T(3,1) = 0,  T(3,2) = 0

在此示例中,我们需要2台服务器:

Server 1: J(1), J(2)
Server 2: J(3)

示例输入:
简短说明:第一个3是测试用例的数量,后跟作业数量(第二个3表示案例1有3个作业),然后是通过E i 和S i ,然后是T矩阵(大小与作业数量相等)。

3
3
3 6
10 15
16 20
0 2 5
0 0 3
0 0 0
4
8 10
4 7
12 15
1 4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
4
8 10
4 7
12 15
1 4
0 50 50 50
50 0 50 50
50 50 0 50
50 50 50 0

示例输出:

Case #1: 2
Case #2: 1
Case #3: 4

个人评论:
所需时间可以表示为图表矩阵,因此我将其假设为有向无环图问题
我到目前为止尝试的方法是蛮力和贪婪,但得到了错误的答案。 (不幸的是我不再有我的代码了)
也许可以通过动态编程来解决,但我不确定 我真的不清楚如何解决这个问题 因此,一个简单的提示或见解将对我非常有帮助。

1 个答案:

答案 0 :(得分:3)

您可以通过计算maximum matching in a bipartite graph来解决此问题。

您的想法是尝试将工作结束时间与工作开始时间相匹配。

匹配的结束时间x和开始时间y表示同一服务器将执行作业x和作业y。

您需要的服务器数量将与不匹配的启动时间相对应(因为每个作业都需要一台新服务器)。

使用NetworkX的示例Python代码:

import networkx as nx
G=nx.DiGraph()

S=[3,10,16] # start times
E=[6,15,20] # end times
T = [ [0, 2, 5],
      [0, 0, 3],
      [0, 0, 0] ] # T[x][y]
N=len(S)

for jobx in range(N):
    G.add_edge('start','end'+str(jobx),capacity=1)
    G.add_edge('start'+str(jobx),'end',capacity=1)
    for joby in range(N):
        if E[jobx]+T[jobx][joby] <= S[joby]:
            G.add_edge('end'+str(jobx),'start'+str(joby),capacity=1)

print N-nx.max_flow(G,'start','end')