---==高分求算法或思路==--

时间:2021-10-12 09:52:53
设有N(N=2^K)位选手参加网球遁环赛,比赛共进行(N-1)天,每位选手要与其它选手比赛一场,且每位选手每天比赛一场,不轮空,试按此要求为比赛安排日程!

10 个解决方案

#1


这个问题,我有c的源代码,但是没有java的程序!
他的解是不唯一的,如果,你需要的话,我可以明天给你!
我下班后,回家拿!

#2


关注

#3


数据结构用二维数组试试

#4


谢谢各位,我已有解!!

#5


来迟了

#6


满有意思

#7


我想将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的思想对选手进行划分,直到只剩下两个选手。这时只要让这两个选手进行比赛日程安排就可以了。意思也就是将N(N=2^k)除以2除上K次,最后将变成二人,制定出二人的日程表后,四人的也就不难了,然后再推到八人,然后以2^k增即可。
以下是8人(N=2^3  当K=3)时的日程表:

日期  1  2  3  |  4  5  6  7
--------------
选手|
 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至选手4和选手5至选手8前3天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样就可以分别安排好选手1至选手4和选手5至选手8在后4天的比赛日程。所以,虽然比赛有N-1天,但我开始只需算出(N-1-1)/2天的日程安排即可,后面的(N/2+1)的日程只需将左上角与左下角的两小块以及左下角与右上角的安排互换即可!!

呵,也不知大家看明白没有!~!

想法是这样,但是我用Java实现的时候却被for和数组搞得理不清思绪了,希望各位有兴趣的兄弟帮忙实现一下,如果写出了代码请贴下面,好让大家都看看!~~

#8


在很多算法书上都有,自己不会去找来看看吗?所谓的程序员,到底有多少人学过数据结构和算法分析呢?不要以为会写几个字符就是程序员了,还是多看点基础的东西吧

#9


你的递归算法我没弄明白,我想到了一个苯方法:求出所有的2人组合,即n*(n-1)/2个组合,然后每天取n-1个,我觉得这样比较容易实现。

#10


Dream_lover()兄:每位选手每天只允许比赛一场,你那样取的话大概会出现一天比赛多场的问题吧

#1


这个问题,我有c的源代码,但是没有java的程序!
他的解是不唯一的,如果,你需要的话,我可以明天给你!
我下班后,回家拿!

#2


关注

#3


数据结构用二维数组试试

#4


谢谢各位,我已有解!!

#5


来迟了

#6


满有意思

#7


我想将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。递归地用这种一分为二的思想对选手进行划分,直到只剩下两个选手。这时只要让这两个选手进行比赛日程安排就可以了。意思也就是将N(N=2^k)除以2除上K次,最后将变成二人,制定出二人的日程表后,四人的也就不难了,然后再推到八人,然后以2^k增即可。
以下是8人(N=2^3  当K=3)时的日程表:

日期  1  2  3  |  4  5  6  7
--------------
选手|
 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至选手4和选手5至选手8前3天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样就可以分别安排好选手1至选手4和选手5至选手8在后4天的比赛日程。所以,虽然比赛有N-1天,但我开始只需算出(N-1-1)/2天的日程安排即可,后面的(N/2+1)的日程只需将左上角与左下角的两小块以及左下角与右上角的安排互换即可!!

呵,也不知大家看明白没有!~!

想法是这样,但是我用Java实现的时候却被for和数组搞得理不清思绪了,希望各位有兴趣的兄弟帮忙实现一下,如果写出了代码请贴下面,好让大家都看看!~~

#8


在很多算法书上都有,自己不会去找来看看吗?所谓的程序员,到底有多少人学过数据结构和算法分析呢?不要以为会写几个字符就是程序员了,还是多看点基础的东西吧

#9


你的递归算法我没弄明白,我想到了一个苯方法:求出所有的2人组合,即n*(n-1)/2个组合,然后每天取n-1个,我觉得这样比较容易实现。

#10


Dream_lover()兄:每位选手每天只允许比赛一场,你那样取的话大概会出现一天比赛多场的问题吧