迴圈賽日程安排問題

2021-09-06 23:18:09 字數 2072 閱讀 8803

問題描寫敘述:

設有n(n=2^k)支隊伍參加迴圈賽,迴圈賽共進行n-1天,每支隊伍要與其它n-1支隊伍比賽一場,且每支隊伍每天必須比賽一場,不能輪空。試按此要求為比賽安排日程。

演算法思路:

我們先安排奇數下標位置與偶數下標位置之間的比賽,就有n/2場,方法非常easy,team[2k]=2k,全部奇數號組成乙個序列[1,3...n-1],然後迴圈移動n/2-1次(比方第2個序列就是[3,5...n-1,1]),然後將該序列填充在team的奇數字置上。

接下來將隊伍一分為二,奇數為一組,偶數為一組,分配安排其內部比賽(由於奇偶數之間前面已經安排過了啦)。以奇陣列[1,3,5,7]為例(以n=8為例說明),我們仍然先安排奇數下標位置與偶數下標位置之間的比賽,也就是[15]與[37]之間的比賽,共同擁有2場(n/4)。

接下來,再將隊伍一分為二,得到[15],[37],[04],[26],對每一部分,仍然是先安排奇數下標位置與偶數下標位置之間的比賽,共1場(n/8)。此時已不可再分出子隊伍,計算結束。

對照賽安排編號:

從前文的分析能夠看出,我們產生比賽日程安排是有規律可循,先產生n/2,然後是n/4,...直到最後1場。因為n=2^k,那麼這些安排場次總數為2^(k-1)+2^(k-2)...+1=2^k-1=n-1,恰好相符(其實是必定的)。

這樣,對於給定乙個編號id,我們首先能夠判定相應場次安排須要進行幾次隊伍**。方法非常easy,比如n=8,id=6,因為一次分烈得到n/2=4場,再次**可得n/4=2場,於是兩次**就可以。同一時候id-4=2,也就是說兩次**後的第2個賽場安排,這個2用於對子隊伍移位計算使用。

參考**:

// team: 比賽安排結構,team[2k] vs team[2k+1] 

// len:  team的總數 

// id:   第id輪的安排,id的範圍[1, len-1] 

void game(int *team, int len, int id)

for (int i=0; i// 以下是測試部分

void dump(int *arr, int len)

int main()

return 0;}

輸出結果:

[01] 00-01 02-03 04-05 06-07 08-09 10-11 12-13 14-15

[02] 00-03 02-05 04-07 06-09 08-11 10-13 12-15 14-01

[03] 00-05 02-07 04-09 06-11 08-13 10-15 12-01 14-03

[04] 00-07 02-09 04-11 06-13 08-15 10-01 12-03 14-05

[05] 00-09 02-11 04-13 06-15 08-01 10-03 12-05 14-07

[06] 00-11 02-13 04-15 06-01 08-03 10-05 12-07 14-09

[07] 00-13 02-15 04-01 06-03 08-05 10-07 12-09 14-11

[08] 00-15 02-01 04-03 06-05 08-07 10-09 12-11 14-13

[09] 00-02 04-06 08-10 12-14 01-03 05-07 09-11 13-15

[10] 00-06 04-10 08-14 12-02 01-07 05-11 09-15 13-03

[11] 00-10 04-14 08-02 12-06 01-11 05-15 09-03 13-07

[12] 00-14 04-02 08-06 12-10 01-15 05-03 09-07 13-11

[13] 00-04 08-12 01-05 09-13 02-06 10-14 03-07 11-15

[14] 00-12 08-04 01-13 09-05 02-14 10-06 03-15 11-07

[15] 00-08 01-09 02-10 03-11 04-12 05-13 06-14 07-15

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

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

日程安排問題

演算法基礎 上的貪婪演算法講的真是好啊,分析的很精到,例子也很實際,遇到了乙個新問題 日程安排,n個日程,以及陣列d,d i 表示任務i的完成期限,陣列g,g i 表示i在d i 前完成可以獲得的收益,求最大收 益序列。n 2的方法不說了,先快排g,降序,按照g順序把遍歷到的每個i插入陣列j中,用並...

迴圈賽問題 日程安排的一種排列方式 使用C 實現

筆試時遇到的題目,當時沒有寫出來。球員個數僅限於2的k次方個,如2 4 8 16 32 第一列表示球員的編號,從第二列開始分別表示比賽的時間第一天 第二天 第三天。include include using namespace std class b private const int n int ...