循环赛日程安排问题

问题描写叙述:
    设有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用于对子队伍移位计算使用。

參考代码:

  1. // team: 比赛安排结构,team[2k] vs team[2k+1]

  2. // len:  team的总数

  3. // id:   第id轮的安排,id的范围[1, len-1]

  4. void game(int *team, int len, int id){

  5. int base = 2;

  6. while (id > len/base){

  7. id -= len/base;

  8. base <<= 1;

  9. }

  10. for (int i=0; i<base/2; ++i){

  11. int start = i+base/2+(id-1)*base;

  12. for (int j=0; j<len/base; ++j){

  13. team[i*2*len/base+2*j] = base*j+i;

  14. team[i*2*len/base+2*j+1] = (start+base*j)%len;

  15. }

  16. }

  17. }

  18. ////////////////////////////////////////////////////////////////////////

  19. // 以下是測试部分
  20. void dump(int *arr, int len){

  21. for (int i=0; i<len; i+=2)

  22. printf("%02d-%02d ", arr[i], arr[i+1]);

  23. printf("/n");

  24. }

  25. int main(){

  26. const int len = 16;

  27. int team[len];

  28. for (int i=1; i<len; ++i){

  29. game(team, len, i);

  30. printf("[%02d] ", i);

  31. dump(team, len);

  32. }

  33. return 0;

  34. }

输出结果:

[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

时间: 2024-12-15 18:56:56

循环赛日程安排问题的相关文章

分治法——循环赛日程安排问题

问题描述: 设有n(2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天只能赛一场,试安排比赛. 举例说明: 1,当n为偶数时,循环赛一共要进行n-1天:比如,有运动员:周董,信哥,蔡依林,小七,一共4个人,可以如下安排: 运动员 第一天 第二天 第三天 周董 信哥 蔡依林 小七 信哥 周董 小七 蔡依林 蔡依林 小七 周董 信哥 小七 蔡依林 信哥 周董 可以看出,当四个人比赛的时候,要比3天才能全部比完. 2,当n为奇数时,循环赛要进行n天

项目经理的磨练(2) 科学的安排项目日程安排

1. 自上向下式 这种方式是指,从项目的整体时间或者重大的里程碑来倒推各项子任务时间,用各项子任务的完成来支撑整个项目的整理时间.这种方式适用于,对项目完成时间要求很严格的项目,项目团队从结束时间开始倒退,划分重要的大里程碑时间,再在大里程碑中,划分小里程碑,任务包,小任务包.最底层的任务越小,估算越准确. 这种方式可能存在的问题是,如果老板说了这个项目6月1日要完成,但是说到小任务算下来,发现根本不够时间完成.做为项目经理的你打算怎么办?后面的故事应该会对你有所启发. 请记住这个时候千万不要想

日程安排满满的,往往容易让人变得忙碌

看看自己的日程安排表,或者看看办公软件(OA.项目管理系统.日程软件)里面的每日日程,一天工作时间安排的是不是满满的.一看满满的日程表,小编的心情立马不好了,觉得今天的工作会很忙.其实,上级给我们任务.任务规定时间以及目标.但是,每天工作日程是我们自己安排的.小编,发现日程安排满满的,往往容易让人变得忙碌.而那些每天预留出一些时间来应该突发时间的人,日程表看着挺简单,但是工作却能够有序做好. 意外发生的事情也会占用你的时间.想想看,你要接电话.查邮件.接待客人--这些日常活动都会占用你的时间.经

2016年1月刘燕彬讲师日程安排

2016年1月刘燕彬讲师的日程安排,红色为忙碌,有需要预订时间的客户请参阅

日程安排手机和电脑同步

6月15日日程安排

1. 首先回顾上一节的表格跨列.然后尝试form中的各种input标签,了解上传数据给服务器是个什么概念?   指出上传文件时的坑 enctype="multipart/form-data"  .这是个什么鬼? 是一个发送给服务器的header头,有什么用? 怎么能看到它? 通过了浏览器的开发工具->网络 2. css的书写,各种选择器. 伪类和伪元素(美观内容)的区别 介绍伪css的布局三基础: 盒模型 浮动 定位(做游戏比较有用) 3. 开始教div+css布局方法,教授常用

循环赛日常表算法(N可为奇数和偶数)

一. 实验题目 设有n位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 二.实验目的 1.深刻理解并掌握“分治算法”的设计思想: 2.提高应用“分治算法”设计技能: 3.理解这样一个观点:用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,

中科院 工程硕士专业课 复试考试前的辅导安排

同学们大家好: 学校定于12月6日.7日组织专业课辅导,1月初进行专业课复试及资格审查. 辅导具体日程安排如下: 12月6日下午13:00  数据结构(报考软件工程.计算机技术领域考生) 人文楼教一阶   12月7日上午9:00   信号与系统(报考电子与通信工程领域考生)     教学楼304 12月7日上午9:00   概率论与数理统计(报考控制工程领域考生)     教学楼315 12月7日上午9:00   电子线路(报考集成电路工程领域考生)         教学楼305 1月复试资格审

web实践小项目&lt;一&gt;:简单日程管理系统(涉及html/css,javascript,python,sql,日期处理)

暑假自学了些html/css,javascript和python,苦于学完无处练手几乎过目即忘...最后在同学的建议下做了个简单日程管理系统.借第一版完成之际,希望能将实践期间犯过的错误和获得的新知进行整理,希望能给其他初学者提供参考,也希望有大神在浏览我粗糙的开发过程中能指出一些意见或建议. (阅读以下内容需要有一定的html/css,javascript,python和sql基础,and谢谢阅读!) 注:实践中的环境为ubuntu 14.04操作系统,python3.4(2.7实测也可行),