分治策略之循环赛

一、实验题目

•设有n个运动员要进行网球循环赛。设计一个满足下列条件的比赛日程表:

–每个选手必须与其他n-1个选手各赛一次;

–每个选手一天只能赛一次;

–当n是偶数时,循环赛进行n-1天。

–当n是奇数时,循环赛进行n天。

二、实验目的及其实验要求

1、使用分治策略,编写程序完成以上实验题目。

2、设置数据集,测试程序,写出测试报告。

3、验证算法的正确性。

4、写出题目的具体分析过程,算法程序进行必要的解析(伪代码+源代码)。

5、分析所完成程序的时间复杂度。

三、实验步骤

一、题目分析

在课堂上,我们已经学习过了,对于2k这种幂次数量的比赛选手,可以直接二分,对调位置得到结果。

完全使用分治策略,问题规模最小是2,可以直接构建比赛集,然后合并,就是将本模块,挪动到对角线位置,构成新的一个整体模块。

这种方法是非常特殊,因为是幂次,所以大大降低了难度,不在此赘余,下面我将这种特殊情况,扩展到更一般情况,n可以是任意整数。


n位奇数时,比赛天数为n天,意味着,每个运动员都有一天的休息时间。

n位偶数时,比赛天数为n-1天,每个运动员每天都有比赛。

首先从基本入手,使用脑算,计算运动员的比赛规则表

(1) n=2

比赛只需要1天,比赛表如上

(2)n=3

比赛的总时间是3天,在这三天中,每个运动员都有一天的休息时间,并且他们每个人的休息时间都不在同一天。

(3)n=4

比赛总天数是3天,4=2+2,分成单独的两个队伍,队伍内先比赛,然后每个队员与另一个队伍中的每个运动员比赛。

(对比n=4和n=3,可以发现,n=4这一行删除,并且把表格中的4删除,就得到了表格n=3)

(4)n=5

比赛的总天数是5天,此时已经发现,没有前几个n比较小的时候容易写了,我们必须使用有效的策略。

n=5规模对于我来说太大了,先跳过吧。

(5)n=6

分成两组 3+3,每一组比赛的时间时3天,合并两组需要3天,总共6天。如何减少一天呢?

两组三天内的比赛,我们看到这是两组一模一样的表,1和4,2和5,3和6都有在相同时间在休息。让他们把空闲的时间利用起来。

然后两组合并。

此时剩下两天需要完成的比赛:

1:5、6

2:4、6

3:4、5

第四天

1vs5 2vs6 3vs4

第五天

1vs6 2vs4 3vs5

完成赛表。


这时,我们在考虑n=5,就简单多了,直接把第6行删除,然后把表格中的6也删除就OK了。

(6)n=7

在n=8的基础上删减得到。

(7)n=8

略,太简单了,见以上第一个图。

(8)n=9依托于n=10的计算。

n=10可以分成5+5,两个形状完全一样的表格,填补。然后在根据一定的算法进行补充后面的4天的表格。

以上,我们可以得到规律,就是对于n=2k,通过适当的删除,我们可以直接得到n=2k-1的比赛表。

而n=2k时可以考虑为n+n两组合并来求。


此时,我们需要对合并算法,进行探究。

再以n=6为例

简单填补后得到前三天的比赛表。

在接下来的2天,还需要完成的比赛

运动员1: 5、6

运动员2:4、6

运动员3:4、5

第四天

运动员1选了5(从小到大),那么运动员2选6( 5+1 ) ,从下一位开始,运动员3选4(7-3)。

第五天

运动员1选了6,运动员2选4(7-3),运动员3选5(8-3)

完毕。


n=10

5+5

对于n=5的表格,我们已经在上述得到,对n=6进行掏空就行。

首先填补对应位置空闲时间,得到如下表格,是前5天的比赛表。

在接下来的4天时间,需要比赛。

运动员1:7、8、9、10

运动员2:6、8、9、10

运动员3:6、7、9、10

运动员4:6、7、8、10

运动员5:6、7、8、9

第6天

7、8、9、10、6

第7天

8、9、10、6、7

第8天

9、10、6、7、8

第9天

10、6、7、8、9

总表如下

因此这个n=10的情况也得到了。

以每组首个运动员第一个需要比赛的运动员为起点,形成一个环。

观察下面两图,可以看到规律。



下面,我将以上规律进行推广。

设f(m~n)表示对m~n个运动员比赛表的生成。

例如n=50

使用分治策略,分别是f(1~25)和f(26~50),这两个长得基本一样,第二个表就是对第一个表中所有数字+25。因此问题分治成求f(1~25),然后和f(26~50)合并。

以下是这个问题的过程。

step 1:  f(1~50) → f(1~25) U  f(26~50)                  step 18: 输出结果,结束。  step 2:  f(1~25) → f(1~26) - f(26)                      step 17: 根据f(1~25)直接写出f(26~50),合并为f(1~50)step 3:  f(1~26) → f(1~13) U f(14~26)                   step 16: f(1~26)删减为f(1~25)step 4:  f(1~13) → f(1~14) - f(14)                      step 15: 根据f(1~13)直接写出f(14~26),合并为f(1~26)step 5:  f(1~14) → f(1~7) U f(8~14)                     step 14: f(1~14)删减为f(1~13)step 6: f(1~7)  → f(1~8) - f(8)                         step 13: 根据f(1~7)直接写出f(8~14),合并为f(1~14)step 7: f(1~8) →  f(1~4) U f(4~8)                       step 12: f(1~8)删减为f(1~7)step 8: f(1~4) →  f(1~2) U f(3~4)                       step 11:  根据f(1~4)直接写出f(5~8)合并为f(1~8)step 9:  直接计算 f(1~2),根据f(1~2)直接写出f(3~4)        step 10:  合并 f(1~2) f(3~4) 得到 f(1~4)

n可以扩展所有可计算范围。

当n为奇数时,通过计算f(n+1),然后删减得到

当n为偶数时,二分,只计算前半部分,后半部分,可以直接“抄袭”前半部分

循环赛问题——原创全解精讲相关推荐

  1. 微信小程序开发全案精讲-刘刚-专题视频课程

    微信小程序开发全案精讲-4467人已学习 课程介绍         微信小程序开发全案精讲是一套以案例为主线的课程,课程总共九章,第一章回顾基础知识,后面八章全部是以典型的案例作为讲解,选取了美食类: ...

  2. 视频教程-微信小程序开发全案精讲-微信开发

    微信小程序开发全案精讲 负责过多个软件项目的研发.设计和管理工作,拥有项目管理师认证.项目监理师中级认证.出版过的图书有<微信小程序开发图解案例教程><Axure RP8原型设计图解 ...

  3. STL之七:STL各种容器的使用时机详解(精讲大全)

    C++标准程序库提供了各具特长的不同容器.现在的问题是:该如何选择最佳的容器类别?下表给出了概述. 但是其中有些描述可能不一定实际.例如:如果你需呀处理的元素数量很少,可以虎落复杂度,因为线性算法通常 ...

  4. python 小学生教材全解_小学教材全解人教版

    <小学教材全解>丛书自2006年问世以来,备受广大师生的呵护与厚爱.历经多年的精心打造,日趋成熟,赢得了国内教育专家和老师.家长.同学们的认可,现在已经成为大家非常喜欢的学习用书. ¥32 ...

  5. python 小学生教材全解_小学六年级教材全解

    <小学教材全解>丛书自2006年问世以来,备受广大师生的呵护与厚爱.历经多年的精心打造,日趋成熟,赢得了全国教育专家和老师.家长.同学的认可和好评,现在已经成为大家非常喜爱的学习用书. ¥ ...

  6. struct用法_精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

    笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...

  7. 牛津英语字典pdf下载_牛津树1阶段精讲笔记分享

    写在前面:我不是英语专业,也不是英语老师,仅仅是自己在家和孩子一起精读牛津树的情况记录.免费分享出来,如果能帮到您,自然很开心. 前段时间想和孩子全英精讲牛津树,奈何没找到合适的,所以才开始自己写.当 ...

  8. java流式上传下载_精讲RestTemplate第6篇-文件上传下载与大文件流式下载

    C++Templates(第2版英文版) 123.24元 (需用券) 去购买 > 本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在S ...

  9. 精讲响应式WebClient第4篇-文件上传与下载

    本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

最新文章

  1. 一文讲解特征工程 | 经典外文PPT及中文解析
  2. 14 Java面试之 IO 流技术
  3. 神经网络早期的感知机模型
  4. 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
  5. ajax post对象参数,ajax用post方法传递参数
  6. Qt 移植到Android
  7. MATLAB周期时域曲线,MATLAB系列之连续时间系统的时域分析
  8. Windows环境配置Anaconda+cuda+cuDNN+pytorch+jupyter notebook
  9. 输入两个整数 n 和 m ,从数列 1 , 2 , 3.......n 中随意取几个数 ,使其和等于 m
  10. 【服务端渲染】NuxtJs 综合案例
  11. php报内存溢出,php为什么运行了一段时间后才报内存溢出?
  12. 如何在服务器中安装mysql 以及安装禅道
  13. js最基础知识回顾1(参数,函数,网页换肤)
  14. jmeter录制脚本(Mac)
  15. 归并排序时间复杂度过程分析
  16. (转载)RAID技术全解图解-RAID0、RAID1、RAID5、RAID100
  17. 如何更改域计算机用户名和密码错误,win7加入域失败:未知的用户名或密码错误 | 绿萝...
  18. jQuery TagsInput
  19. hdu6069 Counting Divisors
  20. java 能实现csgo吗

热门文章

  1. 十一、kotlin的协程 - 缓存、volatile、内存屏障和cas(四) --- 跑题篇
  2. 如何免费下载Microsoft Visual C++ 2010 学习版,计算机二级C语言编译器?
  3. 工作流引擎 Snaker
  4. 银行 IT运维故障管理 可视化案例
  5. 如何有效激励技术人员?
  6. android 注册两次广播,android 4.4 动态注册+静态注册电话短信广播后收到两次onReceive回调的问题...
  7. 什么是企业技术中心?认定后对企业有什么好处?
  8. stm32 diy 机械键盘
  9. 海天味业集中发力品牌建设,让海天酱油赢得销量与口碑的双收
  10. 收件箱和发件箱 表设计_在收件箱中播放不错