遞迴分治篇 迴圈賽日程表NOJ1243

2021-10-25 09:03:06 字數 1111 閱讀 9290

時限:1000ms 記憶體限制:10000k 總時限:3000ms

對於 n=2 個選手,設計乙個滿足以下要求的比賽日程表:

(1)每個選手必須與其他n-1個選手各賽一次;

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

(3)迴圈賽一共進行n-1天。

用分治演算法生成迴圈賽日程表(1到2的n次方個人)

乙個小於等於7的正整數n

迴圈賽日程表(1到2的n次方個人)

(1)將所有的選手分為兩半,n個選手的比賽日程表就可以通

過為n/2個選手設計的比賽日程表來決定;

(2)遞迴地用對選手進行分割,直到只剩下2個選手時;

將比賽日程表設計成乙個n行n-1列的二維表,其中第i行,j列表示第i個選手在第j天比賽的選手。

將第一列取值為1~n對應各位選手,日程表就變成了n行n列的二維表。

採用分治法將所有選手分為兩半,遞迴地進行排表。將n=2k次方問題劃分為4個部分。

(1)左上角:左上角為2^(k-1)個選手在前半程的比賽日程

(2)左下角:左下角為另外2^(k-1)個選手在前半程的比賽日程,由左上角加2 ^ (k-1)得到

(3)右上角:將左下角直接複製到右上角得到另2 ^(k-1)個選手在後半程的比賽日程表

(4)右下角:將左上角直接複製到右上角得到2 ^(k-1)個選手在後半程的比賽日程表

#include

#include

using namespace std;

int k;

int n;

int a[

1000][

10000];

void

settable

(int k)

;int

main()

printf

("\n");

}return0;

}void

settable

(int k)

}

其實只要弄懂了整個解題思路,主要容易出錯的地方就是在日程表複製的時候,座標容易弄錯,需要特別注意!

迴圈賽日程表(分治)

設有 n 2的k次方 個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各自賽一次。2 每個選手一天只能賽一次。3 迴圈賽一共進行n 1天。按分治策略,我們可以將所有的選手分為兩半,n個選手的比賽日程表可以通過n 2個選手設計的比賽日程表來決定。遞迴地...

迴圈賽日程表 分治 遞推 遞迴

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

分治法 迴圈賽日程表

設有n 2k個運動員要進行羽毛球迴圈賽,現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其它n 1個選手各賽一次 2 每個選手一天只能比賽一次 3 迴圈賽一共需要進行n 1天。由於n 2 k,顯然n為偶數。按分治策略,將所有的選手分為兩半,n個選手的比賽日程表就可以通過為n 2個選手設計的比...