演算法作業 迴圈賽問題 分治演算法

2021-07-11 18:03:39 字數 1745 閱讀 9043

題目:設有

n個運動員要進行網球迴圈賽,設計乙個滿足以下要求的比賽日程表 (

1)每個選手必須與其他

n-1個選手各賽一次 (

2)每個選手一天只能賽一次 (

3)當n 

是偶數,迴圈賽進行

n-1天,當

n是奇數,迴圈賽進行n天。

思路分析:如果

n是奇數,其實就等於

n+1種情況下將第

n+1號選手輪空。所以只要考慮

n是偶數的情況。

用分治的思想來做,轉換成

n/2的子問題。考慮兩種情況:

一、n/2

為偶數。這種情況比較簡單。例如

n=4時。

1 2 3 4

2 1 4 3

3 4 1 2

4 3 2 1 可由

n=2的子問題推出。

1 2               1 2 3 4

2 1               2 1 4 3

1 2         3 4               3 4 1 2

2 1  -->

4 3    -->      4 3 2 1

第一次變換下半部分

=上半部分

+n/2,

第二次沿對角線對稱。

二、n/2

為奇數。由於

n/2是奇數,子問題考慮

n/2+1

的情況。怎麼由

n/2+1

的情況推出

n的情況? 例如

n=6時。

先考慮它的子問題

n=4時

1 2 3 4

2 1 4 3

3 4 1 2

4 3 2 1

由於四號選手是非法的所以:

1 2 3 0

2 1 0 3

3 0 1 2

同理推出

1 2 3 0

2 1 0 3

3 0 1 2

4 5 6 0

5 4 0 6

6 0 4 5

對第四列(第三天),只有一號選手和四號選手沒比賽,那就讓他們比。推出

1 2 3 4

2 1 5 3

3 6 1 2

4 5 6 1

5 4 2 6

6 3 4 5

之後的兩天,考慮為比過的兩位選手比賽就行了。比賽的順序按未比賽的後幾個選手順序取模。

例如前三天出現了

4那後兩天為

5 6。前三天出現了

5後兩天為

6 4。

如此處理即可得到

1 2 3 4 5 6

2 1 5 3 6 4

3 6 1 2 4 5

4 5 6 1 2 3

5 4 2 6 3 1

6 3 4 5 1 2

#include#include#include#includeusing namespace std;

int mp[1100][1100];

void dfs(int n)

if(n&1) n++;

int t=n/2;

dfs(t);

for(int i=1;i<=t;i++)

for(int j=1;j<=t+1;j++)

}else}}

}int main()

cout<

演算法設計 迴圈賽

sun 書 計算機演算法設計與分析 q 設有n 2 k個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能參賽一次 3 迴圈賽在n 1天內結束。按此要求將比賽日程表設計成有n行和n 1列的乙個表。在表中的第i行,第j列處填入...

迴圈賽日程表演算法

問題描述 設有n 2 k個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能參賽一次 3 迴圈賽在n 1天內結束。請按此要求將比賽日程表設計成有n行和n 1列的乙個表。在表中的第i行,第j列處填入第i個選手在第j天所遇到的選...

分治法 迴圈賽日程安排問題

問題 描寫敘述 設有n 2 k 位選手參加網球迴圈賽,迴圈賽共進行n 1 天,每位選手要與其它 n 1位選手比賽一場。且每位選手每天僅僅能賽一場,試安排比賽。舉例說明 1,當 n為偶數時,迴圈賽一共要進行n 1 天 比方,有運動員 周董,信哥,蔡依林,小七。一共 4個人,能夠例如以下安排 運動員第一...