1. 问题描述:

设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能参赛一次;
(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1≤i≤n,1≤j≤n-1。8个选手的比赛日程表如下图:

2. 题解

此题如果能发现是分治的题目,那就解决了一半了。我们需要安排2^k支队伍,如果我们能根据2对2 ^ k-1支队伍的赛程表得到2 ^ k支队伍的赛程表,然后自顶向下,也就是说,我只需要安排两支队伍(幼儿园小盆友就能安排hhh)。

如上图所示,假如我们拿到了2对4支队伍的赛程表,如何安排8支队伍呢?1号代替对面的5号和6,7,8比赛(反之亦然),2代替6,3代替7,4代替8,这里的代替是双向的。这样,每支队伍就赛了6场,接下来只需要再增加一天,让刚才相互替换的两支队伍分别交锋即可完成。


第一次拿到这个问题很可能没有思路,这种情况建议打表。当然,如果提前知道这是个分治问题,那问题就容易多了。但是我们假设不知道正解,我们以 k = 3为例,即安排8支队伍的比赛交锋。可以观察一下,不难发现其中有着明显的规律:

相信接下来无需我多说小伙伴们也能懂了,2 ^ k-1也存在着同样的规律,8支队伍A,B矩阵差为4,4支队伍差为2,以此类推 ··· 其中的规律其实就是分治算法的思路,只不过第一次学习分治很难直接想到简单的策略~

3. 代码:

//
// Created by 23011 on 28/3/2022.
//#include<cstdio>
using namespace std;const int maxn = 10000;
int a[maxn][maxn];inline void dfs(int n,int k)
{if(n == 2){a[k][0] = k+1;a[k][1] = k+2;a[k+1][0] = k+2;a[k+1][1] = k+1;}else{dfs(n/2,k);dfs(n/2,k+n/2);for(int i = k; i < k+n/2; i++){for(int j = n/2; j < n; j++) a[i][j] = a[i+n/2][j-n/2];}for(int i = k+n/2; i < k+n; i++){for(int j = n/2; j < n; j++) a[i][j] = a[i-n/2][j-n/2];}}
}int main()
{int n;while(scanf("%d",&n)!=EOF){dfs(n,0);for(int i = 0; i < n; i++){for(int j = 0; j < n; j++) printf("%d ",a[i][j]);printf("\n");}}return 0;
}

分治算法 —— 循环赛日程表相关推荐

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

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

  2. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

    目录 1.问题描述 2.算法分析 算法 3.摘要 参考书籍 1.问题描述 设有个运动员要进行网球循环赛. 现要设计一个满足以下要求的比赛日程表. (1)每个选手必须与其他个选手各比赛一次: (2)每个 ...

最新文章

  1. css超出一行省略号:text-overflow和white-space超出隐藏显示省略号
  2. boostrap3常用组件集合
  3. Java数据校验(Bean Validation / JSR303)
  4. 如何导出已安装的安卓app为apk包
  5. qt 使用插件astyle_astyle使用基础教程
  6. android studio 中怎么写aspectj代码,Android Studio 使用 AspectJ 实践AOP
  7. 取消vs2013在代码中的Reference数量功能
  8. DDD实战成绩管理---用户故事
  9. 医疗行业缩写所表示含义
  10. cad批量打印_CAD批量打印插件的安装与使用方法
  11. 2022DIY电脑配置入门篇(包含各cpu显卡天梯图对比)
  12. 网上传说软件测试培训真的那么黑心吗?都是骗局?
  13. 引用腾讯地图时出现”鉴权失败,请传入正确的key“
  14. FileZilla 无法连接服务器 fzSftp started, protocol_version=11
  15. Android 8.0中各种通知写法汇总
  16. win10微软商店/账号登录一直转圈
  17. 关于premiere中遮罩的几点总结 数媒0802 宋志超
  18. 安全防护工具之:ClamAV
  19. JAVA SE 实战篇 C7 基于CSFramework的聊天室 (下) 客户端APP
  20. Hexo+GithubPage搭建Fan主题的博客(2)本地初始化Hexo博客项目

热门文章

  1. 智能问答(QA)方法总结
  2. qq邮箱、qq空间点击后以word方式打开解决办法
  3. 听专家讲玛雅文明和“世界末日”
  4. 海思编译3516编译出现问题
  5. 奥术神座和计算机科学?
  6. 安装Windows7之后出现“Bootmgr is missing”的解决办法
  7. web前端设计思路和用户新体验
  8. solidity采坑日记之智能合约返回事件内容解析
  9. Ubuntu外接显示器可识别却黑屏
  10. word paper排版的一些操作