時限:1000ms 記憶體限制:10000k 總時限:3000ms
描述用分治演算法生成迴圈賽日程表(1到2的n次方個人)
輸入乙個小於等於7的正整數n
輸出迴圈賽日程表(1到2的n次方個人)
輸入樣例
輸出樣例
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
提示**
/*
思路:二分法
假設有兩名比賽隊員,那麼兩個人的編號就是1、2
如果有四名隊員,那麼編號就是1、2、3=(1+2)、4=(2+2)
如果有八名隊員,那麼編號就是1、2、3、4、5=(1+4) 6=(2+4) 7=(3+4) 8=(4+4)
此時應該可以看出規律了,他們唯一的不同就是編號。
以四人為例:
那麼我們可以將其分為兩個賽區,第一賽區1和2號,第二賽區3和4
那麼第一賽區的安排和第二賽區的安排就一模一樣(不同之處在於選手編號在第一賽區基礎上+2)
那麼賽程的上半程就可以直接安排出來了
接下來安排賽程的下半程,將1號和2號放入第二賽區,3號和4號放入第一賽區。
他們的賽程安排從上半程賽區安排直接複製就可以了。
以八個人為例,八個人可以分成兩批,每批四個人,再將四個人分成每批兩個人,再分成每批乙個人,也就是自己跟自己
*/ #includeusing namespace std;
int a[200][200]=,n;
int main()
while(cnt <= n)
} for(i = 0;i < k;i++)
} k *= 2;
} for(i = 0;i < m;i++)else
} }}
遞迴分治篇 迴圈賽日程表NOJ1243
時限 1000ms 記憶體限制 10000k 總時限 3000ms 對於 n 2 個選手,設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能賽一次 3 迴圈賽一共進行n 1天。用分治演算法生成迴圈賽日程表 1到2的n次方個人 乙個小於等於7的正整數n ...
1243 迴圈賽日程表
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述 用分治演算法生成迴圈賽日程表 1到2的n次方個人 輸入 乙個整數n 輸出 迴圈賽日程表 1到2的n次方個人 輸入樣例 3輸出樣例 1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 ...
迴圈賽日程表
對於書上那個日程表的實現,第三版的課本給出了迴圈實現的方法,不過這個表的生成明顯要用遞迴方法生成更為合適,此表如下 可以看到每次該錶的生成總可以分成四個字表的填充過程,初始化讓左邊第一列填充上之後,然後每一次先遞迴填充左上角的子表,然後再填充左下角的子表,然後右上和右下的子表用copy的方法填充,實...