单循环赛,每个队参加前后两场比赛之间的距离最大,这就是这个问题的要求。
这个问题,使用简单回溯,剪剪枝好像可以,但是要当n很大的时候就很为难,速度什么的成了问题。所以这里,我使用了近似算法。
观察问题,发现这是一个对称矩阵的问题,那么我有几条启发式规则:
(1)插入矩阵的元素,不应该和前 m 的元素同行很列。
这个,很简单可以理解,这是为了使最小间距得意保证。
(2)插入的位置,应尽可能在行或者列上占据更多的空格。
这个,有一点难理解,主要是先插入的元素理应占有利位置,这样越往后,差距变大的可能性就提高了。
否则当后面插入时,差距就会变小
(3)插入位置理应和个行列产生最大的行间距。
这个也好理解,主要是为了保证最小间距最大。
(4)插入位置理应靠近上三角的中心。
这个还是为了保证插入时能很有效的满意。
之后,我们便是不断地尝试(1)里面提到的m的值。这里,我们先来估计一下m的上界吧。假设最小间距为m,那么(i,j) 先比赛,比赛之后就是(i,k)比赛,这样必须除了i,j,k之外还至少有2m个球队,所以 n >= 2m + 3;也就是 m <= [(n-3)/2];
这样,我们便开始从m的上界开始,向下检索。
结果如下:(5 到 49,result是结果,der_result_for_ideal_bound 是与理想上界的差,cpu_clock是消耗的cpu时钟数)
5: result = 2 , der_result_for_ideal_bound = 0 , cpu_clock = 1
6: result = 2 , der_result_for_ideal_bound = 0 , cpu_clock = 10
7: result = 2 , der_result_for_ideal_bound = 1 , cpu_clock = 10
8: result = 2 , der_result_for_ideal_bound = 1 , cpu_clock = 10
9: result = 3 , der_result_for_ideal_bound = 1 , cpu_clock = 10
10: result = 3 , der_result_for_ideal_bound = 1 , cpu_clock = 20
11: result = 4 , der_result_for_ideal_bound = 1 , cpu_clock = 20
12: result = 4 , der_result_for_ideal_bound = 1 , cpu_clock = 20
13: result = 4 , der_result_for_ideal_bound = 2 , cpu_clock = 50
14: result = 5 , der_result_for_ideal_bound = 1 , cpu_clock = 40
15: result = 5 , der_result_for_ideal_bound = 2 , cpu_clock = 80
16: result = 5 , der_result_for_ideal_bound = 2 , cpu_clock = 120
17: result = 6 , der_result_for_ideal_bound = 2 , cpu_clock = 130
18: result = 6 , der_result_for_ideal_bound = 2 , cpu_clock = 210
19: result = 6 , der_result_for_ideal_bound = 3 , cpu_clock = 320
20: result = 7 , der_result_for_ideal_bound = 2 , cpu_clock = 260
21: result = 7 , der_result_for_ideal_bound = 3 , cpu_clock = 420
22: result = 7 , der_result_for_ideal_bound = 3 , cpu_clock = 580
23: result = 8 , der_result_for_ideal_bound = 3 , cpu_clock = 630
24: result = 8 , der_result_for_ideal_bound = 3 , cpu_clock = 660
25: result = 8 , der_result_for_ideal_bound = 4 , cpu_clock = 1270
26: result = 9 , der_result_for_ideal_bound = 3 , cpu_clock = 1070
27: result = 10 , der_result_for_ideal_bound = 3 , cpu_clock = 1040
28: result = 10 , der_result_for_ideal_bound = 3 , cpu_clock = 1350
29: result = 10 , der_result_for_ideal_bound = 4 , cpu_clock = 2120
30: result = 11 , der_result_for_ideal_bound = 3 , cpu_clock = 6260
31: result = 11 , der_result_for_ideal_bound = 4 , cpu_clock = 2700
32: result = 11 , der_result_for_ideal_bound = 4 , cpu_clock = 2950
33: result = 11 , der_result_for_ideal_bound = 5 , cpu_clock = 8080
34: result = 12 , der_result_for_ideal_bound = 4 , cpu_clock = 4310
35: result = 13 , der_result_for_ideal_bound = 4 , cpu_clock = 4110
36: result = 13 , der_result_for_ideal_bound = 4 , cpu_clock = 7970
37: result = 14 , der_result_for_ideal_bound = 4 , cpu_clock = 5230
38: result = 13 , der_result_for_ideal_bound = 5 , cpu_clock = 9520
39: result = 14 , der_result_for_ideal_bound = 5 , cpu_clock = 8910
40: result = 14 , der_result_for_ideal_bound = 5 , cpu_clock = 14410
41: result = 15 , der_result_for_ideal_bound = 5 , cpu_clock = 20310
42: result = 14 , der_result_for_ideal_bound = 6 , cpu_clock = 25880
43: result = 15 , der_result_for_ideal_bound = 6 , cpu_clock = 27760
44: result = 16 , der_result_for_ideal_bound = 5 , cpu_clock = 27790
45: result = 14 , der_result_for_ideal_bound = 8 , cpu_clock = 65320
46: result = 16 , der_result_for_ideal_bound = 6 , cpu_clock = 45770
47: result = 16 , der_result_for_ideal_bound = 7 , cpu_clock = 49920
48: result = 17 , der_result_for_ideal_bound = 6 , cpu_clock = 56730
49: result = 17 , der_result_for_ideal_bound = 7 , cpu_clock = 60300
total_clock:1004671