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

简介: 问题描述: 设有n(2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天只能赛一场,试安排比赛。   举例说明: 1,当n为偶数时,循环赛一共要进行n-1天;比如,有运动员:周董,信哥,蔡依林,小七,一共4个...




问题描述:


设有n2^k)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天只能赛一场,试安排比赛。

 

举例说明:


1,当n为偶数时,循环赛一共要进行n-1天;比如,有运动员:周董,信哥,蔡依林,小七,一共4个人,可以如下安排:



 

运动员

第一天

第二天

第三天

周董

信哥

蔡依林

小七

信哥

周董

小七

蔡依林

蔡依林

小七

周董

信哥

小七

蔡依林

信哥

周董

 


可以看出,当四个人比赛的时候,要比3天才能全部比完。



 

2,当n为奇数时,循环赛要进行n天;如图,现有运动员:周董,信哥,蔡依林

,比赛安排表如下:


 

运动员

第一天

第二天

第三天

周董

信哥

蔡依林

X

信哥

周董

X

蔡依林

蔡依林

X

周董

信哥

 


可以看出,当n=3时,人数为奇数,并且出现轮空现象。

 



综上,我们可以得出一个基本结论

 

 

比赛次数=

n为偶数

n-1

n为奇数

n

 

 

 

算法描述:

 

按照分治策略,我们将n个选手先一分为二,每组n/2人,如果n为奇数,则(n+1/2后分组,然后像我们一起的归并排序那样,一直分下去,直到最后只有两个人比赛。

 


举例说明,6个人比赛,需要比赛5天,安排如下:

 


1

2

3

4

5

6

2

1

5

3

6

4

3

6

1

2

4

5

4

5

6

1

3

2

5

4

2

6

1

3

6

3

4

5

2

1

 

 


回想我们的归并排序,归并排序是先分开,最后再合起来。这里也是。

 


我们先将6个人分成2组,每组3个人([1,2,3],[4,5,6]),然后发现3是个奇数,然后在每组中+1个虚拟人:XY;这样,每组就变成了4个人,然后将这4个人在除以2,我们就得到了一个两两组合的小的组。

 


首先来看[1,2]; [3,x]

 


1

2

2

1

 


3

X

X

3

 



将这两组合起来:

 

 

1

2

2

1

3

X

X

3

 

 

这样,第一天的比赛排好了,然后来排第二天的比赛。

 

接下来第二天让13比较,这样2就只能跟x比较了。

 

 

1

2

3

2

1

3

3

X

1

X

3

2

 



依此类推,第三天,让1x比较,23比较:

 

1

2

3

x

2

1

x

3

3

X

1

2

X

3

2

1

 



这里要得到3个选手的比赛安排,所以,我们将假象的X去掉,并将它的位置以*代替:


 

1

2

3

*

2

1

*

3

3

*

1

2

 

 

 

然后我们也按照这个规律,安排[4,5,6]的日程,得到表格



 

4

5

6

*

5

4

*

6

6

*

4

5

 



将前3天的日程安排合并起来:

 

1

2

3

*

2

1

*

3

3

*

1

2

4

5

6

*

5

4

*

6

6

*

4

5

 

 

 

我们可以看到,第一天,36都空闲,可以让他们比赛;第二天,25都空闲,可以让他们比赛;第三天,14空闲,让他们相互比赛;

 


所以,上表重新安排,得到前3天的日程安排表:

 

1

2

3

4

2

1

5

3

3

6

1

2

4

5

6

1

5

4

2

6

6

3

4

5

 

 


这样,我们就比较过了[1,2,3][4,5,6].

 

然后循环下,得到:

 

[1,2,3]& [5,6,4]

[1,2,3]& [6,4,5]

 

 



安排三天的比赛:

 

1

2

3

5

2

1

6

3

3

4

1

2

5

6

4

1

6

5

2

4

4

3

5

6

 



1

2

3

6

2

1

4

3

3

5

1

2

6

4

5

1

4

6

2

5

5

3

6

4

 




选取黄色的日程安排,加入到前3天的日程安排表中:

 

1

2

3

4

5

6

2

1

5

3

6

4

3

6

1

2

4

5

4

5

6

1

3

2

5

4

2

6

1

3

6

3

4

5

2

1

 

 



如果n恰好等于2^k,那么,安排日程表就变得比较简单了,我们先安排两位选手,


1

2

2

1

 



安排4位选手:

 

1

2

3

4

2

1

4

3

3

4

1

2

4

3

2

1

 

这时候,我们先按照两个选手的,将12的安排填好,然后填写左下角的安排,然后将左下角的元素抄到右上角,最后将左上角的元素抄到右下角。




小结:


    分治法在将大问题一步一步两两分,直到划分成可以解决的小问题时,求出这些小问题的解,然后再将小问题合成大问题的解,但是前提是这些小问题在求解是不受到其他小问题的解的影响的。








 



目录
相关文章
|
安全 计算机视觉 Python
最全 Python 知识框架总结,一图看懂!
最全 Python 知识框架总结,一图看懂!
477 0
|
安全 Java 测试技术
如何搭建 WebGoat 靶场保姆级教程(附链接)
如何搭建 WebGoat 靶场保姆级教程(附链接)
|
Unix Linux 网络安全
【工具使用】SecureCRT的下载、安装图文详细过程介绍
【工具使用】SecureCRT的下载、安装图文详细过程介绍
3376 0
|
9月前
|
JSON 监控 API
深度分析快手API接口,用Python脚本实现
快手开放平台提供丰富API接口,覆盖内容管理、用户互动、直播运营等场景,服务于企业开发者及内容创作者。本文解析其接口体系、OAuth 2.0认证机制,并示例Python调用实现。
课时4:JDK简介
课时4:JDK简介。主讲人李兴华,内容分为两部分:1. JDK的具体内容;2. JDK的下载。JDK(Java开发工具包)是Java开发的核心工具,提供编译和解释功能,必须通过官方网站下载并配置。目前主要版本为JDK 10,历史版本包括JDK 1.0、JDK 1.2、JDK 1.5、JDK 1.8等。JDK下载页面提供多平台支持,需先接受协议再选择适合的操作系统版本进行下载。安装完成后即可搭建Java开发环境。
381 0
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
2073 3
STM32:GPIO控制LED闪烁代码部分(内含配置图+代码+代码注释)
STM32:GPIO控制LED闪烁代码部分(内含配置图+代码+代码注释)
1215 0
STM32:GPIO控制LED闪烁代码部分(内含配置图+代码+代码注释)
Python 绘制漂亮的折线图
折线图是一种用于展示数据随时间或其他变量变化趋势的图表。在 Python 中,我们可以使用`matplotlib`库来绘制漂亮的折线图。`matplotlib`是一个功能强大且广泛使用的绘图库,它提供了丰富的工具和选项来创建各种类型的图表。
Python 绘制漂亮的折线图
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
635 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
|
安全 关系型数据库 MySQL
Web安全-任意文件下载漏洞
Web安全-任意文件下载漏洞
1128 5

热门文章

最新文章