題目:設有
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個人,能夠例如以下安排 運動員第一...