3.2.4循环赛日程表(递归与分治)
目录
1.问题描述
2.算法分析
算法
3.摘要
参考书籍
1.问题描述
设有个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表。
(1)每个选手必须与其他个选手各比赛一次;
(2)每个选手一天只能参赛一次;
(3)循环赛在天内结束。
请按此要求将比赛日程表设计成有行和列的一个表。在表中的第 行,第 列处填入第 个选手在第 天所遇到的选手,其中.
2.算法分析
按照分治策略,可以将所有的选手分为两半,则个选手的比赛日程表可以通过个选手的比赛日程表来决定。递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。
图(c)是8个选手的比赛日程表。其中左上角与左下角的两小块分别为选手1~4和选手5~8前三天的比赛日程。据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这样就分别安排好了选手1~4和选手5~8在后4天的比赛日程。依次思想容易将这个比赛日程表推广到具有任意多个选手的情形。
(a) 两个选手
1 2 2 1 (b) 4个选手
1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 (c) 8个选手
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
算法
利用分治法安排循环赛日程表的算法如下:
//当k=6时,2^6=64,矩阵元素的输出宽度定义为3;
//当k>6时,数组a[]的大小MAX和矩阵元素的输出宽度都需要调整
#define MAX 100
int a[MAX][MAX];//实现方阵的复制
//源方阵的左上角顶点坐标(fromx,fromy),行列数为r
//目标方阵的左上角顶点坐标(tox,toy),行列数为r
void Copy(int tox, int toy, int fromx, int fromy, int r)
{for(int i=0; i<r; i++)for(int j=0; j<r; j++)a[tox + i][toy + j] = a[fromx + i][formy + j];
}
//构造循环赛日程表,选手的数量n=2^k
void Table(int k)
{int i,r;int n = 1 <<k;//构造正方形表格的第一行数据for(i=0; i<n; i++)a[0][i] = i+1;//采用分治算法,构造整个循环赛日程表for(r=1; r<n; r<<=1)for(i=0; i<n ; i+=2*r){Copy(r,r+i,0,i,r);Copy(r,i,0,r+i,r);}
}
3.摘要
int n = 1 << k; // 表示n取值为2^k
<< 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
>> 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
假设变量 A 的值为 60, A << 2 将得到 240,即为 1111 0000. A >> 2 将得到 15,即为 0000 1111.
参考书籍
算法设计与分析 -----以ACM大学生程序设计竞赛在线题库为例 ------清华大学出版社
3.2.4循环赛日程表(递归与分治)相关推荐
- 循环赛日程表问题(分治算法)
循环赛日程表问题(分治算法) 设有n=2kn=2^kn=2k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n−1n-1n−1个选手各赛一次: (2)每个选手 ...
- 循环赛日程表(递归实现)
题目说明: 设有n=2k(k为上标)个选手要进行循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表 ...
- 循环赛日程表 (递归与分治)
文章目录 1.题目 2.问题分析 3.什么是分治 4.算法实现思路 1.对表进行分析 2.对表的实现 1.递归 2.循环 5算法实现代码 1.递归 2.循环 6.时间\空间复杂度 1.递归 1.空间复 ...
- 递归与分治策略算法之循环赛日程表
递归与分治策略算法之循环赛日程表 1.先简单的来介绍一下分治策略的思想 分治策略的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,分解出来的子问题与原问题相同,并且相互独立.通过递归去解决子 ...
- python【数据结构与算法】循环赛日程表(分治)
文章目录 1 概述 2 解决 1 概述 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 循环赛一共需要进行n-1天. 由于n=2^k个运动员,显 ...
- 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt
<王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...
- 任意人数的循环赛日程表 分治 非分治 c++
循环赛日程表 要求 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环赛进行n天: 举例 4位 ...
- 【分治】循环赛日程表(C++)
一.循环赛日程表问题 <算法设计与分析(第5版)>-王晓东,第35页 1. 问题描述 设有n=2k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1 ...
- python实现循环赛日程表问题的算法_循环赛日程表的分治算法实现实验报告gxl.doc...
循环赛日程表的分治算法实现实验报告gxl PAGE PAGE 2 深 圳 大 学 实 验 报 告 课程名称: 算法设计与分析 实验项目名称: 分治算法 --矩阵相乘的Strassen算法及时间复杂性分 ...
最新文章
- 电商的「穿衣AI」用得好,剁手根本停不了 | CVPR 2020
- PHP输出表格的方法
- 自己写了个nginx启动脚本,shell
- 征稿 | MIUA 2022 医学影像理解与分析会议
- Window10环境下的Jupyter notebook安装与打开默认路径的修改
- docker nginx部署web应用_实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署...
- 漫画:什么是字符串匹配算法?
- android循环滚动textview,Android 循环上下滚动
- GitHub 40000星!收下这份宇宙最强「程序员装备指南」
- .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结
- 1024程序员节来了,
- sqlplus set linesize/pagesize等命令详解
- 页面老报错: 对象不支持此属性或方法
- SQL Server 2005 高速下载
- 英语四六级写作救命万能表达
- 基于学习的平面抓取检测方法分类及讨论
- PTA-然后是几点(基础编程题)
- 如何在Win7安装U盘中加入USB3.0驱动的支持
- 【一键卸载mysql-5.7.38数据库+dos命令bat脚本】
- 【量化】基于聚宽实现基本面多因子选股+技术指标择时策略