目录

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循环赛日程表(递归与分治)相关推荐

  1. 循环赛日程表问题(分治算法)

    循环赛日程表问题(分治算法) 设有n=2kn=2^kn=2k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n−1n-1n−1个选手各赛一次: (2)每个选手 ...

  2. 循环赛日程表(递归实现)

    题目说明: 设有n=2k(k为上标)个选手要进行循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表 ...

  3. 循环赛日程表 (递归与分治)

    文章目录 1.题目 2.问题分析 3.什么是分治 4.算法实现思路 1.对表进行分析 2.对表的实现 1.递归 2.循环 5算法实现代码 1.递归 2.循环 6.时间\空间复杂度 1.递归 1.空间复 ...

  4. 递归与分治策略算法之循环赛日程表

    递归与分治策略算法之循环赛日程表 1.先简单的来介绍一下分治策略的思想 分治策略的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,分解出来的子问题与原问题相同,并且相互独立.通过递归去解决子 ...

  5. python【数据结构与算法】循环赛日程表(分治)

    文章目录 1 概述 2 解决 1 概述 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 循环赛一共需要进行n-1天. 由于n=2^k个运动员,显 ...

  6. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  7. 任意人数的循环赛日程表 分治 非分治 c++

    循环赛日程表 要求 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环赛进行n天: 举例 4位 ...

  8. 【分治】循环赛日程表(C++)

    一.循环赛日程表问题 <算法设计与分析(第5版)>-王晓东,第35页 1. 问题描述 设有n=2k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1 ...

  9. python实现循环赛日程表问题的算法_循环赛日程表的分治算法实现实验报告gxl.doc...

    循环赛日程表的分治算法实现实验报告gxl PAGE PAGE 2 深 圳 大 学 实 验 报 告 课程名称: 算法设计与分析 实验项目名称: 分治算法 --矩阵相乘的Strassen算法及时间复杂性分 ...

最新文章

  1. 电商的「穿衣AI」用得好,剁手根本停不了 | CVPR 2020
  2. PHP输出表格的方法
  3. 自己写了个nginx启动脚本,shell
  4. 征稿 | MIUA 2022 医学影像理解与分析会议
  5. Window10环境下的Jupyter notebook安装与打开默认路径的修改
  6. docker nginx部署web应用_实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署...
  7. 漫画:什么是字符串匹配算法?
  8. android循环滚动textview,Android 循环上下滚动
  9. GitHub 40000星!收下这份宇宙最强「程序员装备指南」
  10. .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结
  11. 1024程序员节来了,
  12. sqlplus set linesize/pagesize等命令详解
  13. 页面老报错: 对象不支持此属性或方法
  14. SQL Server 2005 高速下载
  15. 英语四六级写作救命万能表达
  16. 基于学习的平面抓取检测方法分类及讨论
  17. PTA-然后是几点(基础编程题)
  18. 如何在Win7安装U盘中加入USB3.0驱动的支持
  19. 【一键卸载mysql-5.7.38数据库+dos命令bat脚本】
  20. 【量化】基于聚宽实现基本面多因子选股+技术指标择时策略

热门文章

  1. 高速相机在企业生产领域的应用效果
  2. python的翻译方式-python实现带声音的摩斯码翻译实现方法
  3. 小型SDDC建设攻略
  4. Windows AD证书服务系列---部署及管理证书模板(1)
  5. Windows2012 桌面显示我的电脑
  6. 客户成功的「本手、俗手、妙手」
  7. 手动制作U盘启动盘(确保纯净的win系统)
  8. 无线网络优化学习第一天
  9. C语言课设:影院售票管理系统
  10. Particle Builder Elemental Pack for Mac(ae粒子特效模板)