分治法解乒乓球比赛日程安排问题
2018-01-02 17:20
603 查看
乒乓球比赛的日程安排
问题:
设有n位选手参赛,初赛进行n-1天,每位选手每天必须比赛一次,不能轮空。编程求解赛程安排。
分析:
1、求n位选手的赛程安排,可采用分治算法的思想,将问题规模不断缩小,比如缩小到8,4,2等规模大小;
2、分析2,4,8等小规模时的赛程安排:
分治算法主要思想:
(1)、若原问题规模大小不便计算,将问题原本规模分解成若干个规模较小的相同问题;
(2)、每个子问题求解相互独立,且与原问题形式相同,递归解这些子问题合并后组成原问题答案;
分治算法适用问题:
(1)、问题可分解成若干个规模较小的相同问题;
(2)、合并子问题的解可以得到原问题的解;
(3)、各个子问题相互独立;
分治算法的主要步骤:
(1)、分解:缩小问题规模;
(2)、求解:足够小的规模可用简单方法求解;
(3)、合并:按照求解问题要求,合并子问题的解,构成最终的解;
代码实现:
答案截图:
缺陷:
只能解决2的整数次幂数据输入;
数据大小限制,不过可以在代码头部,宏定义部分修改;
*****
分治和递归的区别与联系:
递归:函数直接或者间接的调用自身;
递归是分治算法在解决问题时可能用到的方法(当问题规模足够简单时直接计算即可);
问题:
设有n位选手参赛,初赛进行n-1天,每位选手每天必须比赛一次,不能轮空。编程求解赛程安排。
分析:
1、求n位选手的赛程安排,可采用分治算法的思想,将问题规模不断缩小,比如缩小到8,4,2等规模大小;
2、分析2,4,8等小规模时的赛程安排:
分治算法主要思想:
(1)、若原问题规模大小不便计算,将问题原本规模分解成若干个规模较小的相同问题;
(2)、每个子问题求解相互独立,且与原问题形式相同,递归解这些子问题合并后组成原问题答案;
分治算法适用问题:
(1)、问题可分解成若干个规模较小的相同问题;
(2)、合并子问题的解可以得到原问题的解;
(3)、各个子问题相互独立;
分治算法的主要步骤:
(1)、分解:缩小问题规模;
(2)、求解:足够小的规模可用简单方法求解;
(3)、合并:按照求解问题要求,合并子问题的解,构成最终的解;
代码实现:
#include <iostream>
#define max 64
int a[max+1][max+1] = {0};
void game_cal(int k, int n)
{
if (n == 2)
{
a[k][1] = k;
a[k][2] = k + 1;
a[k+1][1] = k+1;
a[k+1][2] = k;
}
else
{
game_cal(k, n/2);
game_cal(k+n/2, n/2);
for (int i = k; i < k+n/2; ++i)
{
for (int j = n/2+1; 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+1; j <= n; ++j)
a[i][j] = a[i-n/2][j-n/2];
}
}
}
int main()
{
int num;
std::cout << "enter the player numbers:" << std::endl;
std::cin >> num;
game_cal(1, num);
std::cout << " n ";
for (int i = 1; i < num; ++i)
std::cout << i << " ";
std::cout <<std::endl;
for (int i = 1; i <= num; ++i)
{
for (int j = 1; j <=num; ++j)
printf("%2d", a[i][j]);
std::cout << std::endl;
}
return 0;
}
答案截图:
缺陷:
只能解决2的整数次幂数据输入;
数据大小限制,不过可以在代码头部,宏定义部分修改;
*****
分治和递归的区别与联系:
递归:函数直接或者间接的调用自身;
递归是分治算法在解决问题时可能用到的方法(当问题规模足够简单时直接计算即可);
相关文章推荐
- 递归分治实现比赛日程安排(仅对2…
- 分治算法:乒乓球比赛的日程安排
- C语言经典算法100例-022-乒乓球比赛名单问题
- 【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树的直径/LCA/树的点分治
- 计数问题-分治
- bzoj 4016: [FJOI2014]最短路径树问题 最短路+点分治
- 循环问题2012蓝桥杯省赛第四题 奇怪的比赛(暴力解决)
- 关于在搭建PC2比赛环境时遇到的几点问题
- POJ1741-树的分治&树的重心&树上的路径问题-Tree
- 29-乒乓球比赛对战名单分析
- 比赛日程安排程序
- 递归和分治——整数划分问题
- 问题 O: 选美比赛
- 第四章 分治策略 4.1 最大子数组问题(自己想的,不知道是不是减治法)
- 山东理工大学第七届ACM校赛-学区房问题 分类: 比赛 2015-06-26 10:23 89人阅读 评论(0) 收藏
- 最大子段和问题的分治实现和动态实现
- 2018年全国多校算法寒假训练营练习比赛(第三场)E-进击吧!阶乘(大数问题)
- 【100题】第三十六 比赛淘汰问题(谷歌笔试)
- c编程:乒乓球比赛,找出谁和谁对打
- 乒乓球比赛