分治算法——乒乓球比赛日程问题
分治算法
将一个计算复杂的问题分为若干个子问题来进行求解,然后综合各个小问题得到复杂问题的最终答案
分解:
将原问题分解为若干规模较小的,相互独立,与原问题相同的子问题解决:
如果小问题容易解决就解决若干的子问题,不然就是继续解决第一个步骤,直到子问题可以解决合并:
将解决好的子问题的解合并为原问题的解有些问题是不需要合并子问题的解的,此时就不需要第三步了。
例题
乒乓球比赛日程问题:
问题:设有n名选手参赛,初赛进行n-1天,每位选手每一天必须比赛一次不轮空。- 分析:
- 对于n位选手来说,这是一个复杂的计算,可以将它分解为较为小的子问题,比如说只有两个人参赛;
- 解决两个人参赛的赛程,发现还是不足以分配,然后再分析4个人、8个人……等,直到问题得以解决
- 分析:
解决:
#include<stdio.h>
#include<stdlib.h>
void schedule(int n,int m);
int check(int m);
int player[65][65] = {0};
int main()
{int m; printf("输入参赛人数:");scanf("%d",&m);if(!check(m)){printf("输入的数必须是2的整数幂");return 0;}schedule(1,m);for(int i = 1;i <= m;i++){for(int j = 1;j <= m;j++){printf("%3d",player[i][j]);}printf("\n");}}
void schedule(int n,int m)
{if(m == 2){ //达到最小可以解决的时候player[n][1] = n;player[n][2] = n+1;player[n+1][1] = n+1;player[n+1][2] = n;}else{schedule(n,m/2);//没到最小可以解决的时候就继续分解schedule(n + m/2,m/2);//这时候已经解决完了最小可解决问题,回来解决另一半的最小程度m//开始解决剩下的部分for(int i = n+m/2;i <= n+m; i++){for(int j = m/2 + 1;j <= m;j++){player[i][j] = player[i - m/2][j - m/2];}}for (int i = n; i < n + m/2; i++){for(int j = m/2 + 1;j <= m; j++){player[i][j] = player[i + m/2][j - m/2];}}}
}
int check(int m)
{int i = 2;int j = 2;for(int i;i < 8;i++){j *= 2;if(j == m) break;}if(i >= 8){return 0;}return 1;
}
分治算法——乒乓球比赛日程问题相关推荐
- 分治算法兵乓球比赛日程(java)
分治算法之兵乓球比赛日程 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.也就是字面上的解释是" ...
- java 比赛赛程_分治算法兵乓球比赛日程(java)
分治算法之兵乓球比赛日程 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.也就是字面上的解释是" ...
- 分治算法之循环赛程日志表
什么是分治算法? 就是当求解的数据过多,计算的过程过于复杂的情况即可使用分治算法 分治算法的一般步骤: 1.分解:将复杂问题划分为若干同类小问题 2.求解:当子问题足够小时,用简单的方法解决 3.合并 ...
- 漫画:5分钟弄懂分治算法!它和递归算法的关系!
分治顾名思义"分而治之",英文的意思翻译为"分割并征服". 分治思想,简而言之就是将原问题分解成与"原问题相同但是规模更小"的子问题,并可以 ...
- 三十三、分治算法---汉诺塔问题
一.分治算法的介绍 分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以 ...
- 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)
本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...
- 从分治算法到 MapReduce
为什么80%的码农都做不了架构师?>>> 从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分 ...
- 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc
分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...
- 编程珠玑第八章——分治算法求解数组中的最大的连续和
关键在于把数组分为两个部分a,b.最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc. 一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在 ...
最新文章
- Python速度提升
- python中的连续比较是什么_在python中提取连续行之间的差异
- 怎样能做好百度竞价推广?不妨参考下这篇竞价推广的日常工作流程
- spring集成kafka
- Python 怎么样在函数内部对全局变量进行修改
- 双十一大促技术只做两件事情?来看看阿里巴巴的技术之道
- CRM和C4C里的组织架构 - Organizational Structure
- PHP大数据处理【转】
- lamda表达式修改数据_图解sql面试题:如何按条件修改数据?
- 训练日志 2019.4.17
- 理论基础 —— 二叉树
- Htmlt_Div+Css简介
- Printer Processor 导致的一个问题
- mybaties :required string parameter ‘XXX‘is not present
- uni-app开发开发h5,小程序,app,注意事项
- WM6电话簿转到Android系统
- 计算机桌面组成部分教案,三年级第6课 《认识桌面》优秀教案
- 在微信小游戏中使用tensorflow的face-landmarks-detection
- 面试了一个 37 岁程序员,让我有所触动,35岁以上的程序员该何去何从?
- PCB设计中的的3W规则和20H原则
热门文章
- 车辆提示请防止车辆滑动 即车辆驻车异常
- vue 富文本存储_VUE 富文本(vue2-editor)
- 几何基础 点投影到直线
- 读邹欣关于大学生关系有感
- 写一段python判断是否是闰年的代码
- 软件工程毕业设计课题(38)基于JAVA毕业设计JAVA座位预约餐厅网站系统毕设作品项目
- STM32 使用Keil下载仿真时,报错 JLink Info: STM32Fxxxx: Cannot attach to CPU. Trying connect under reset.
- 图像增强(空域滤波)——图像平滑
- 【JAVA百炼成仙】元婴篇——藏在游戏中的数组
- java基础考试_java基础笔试题