网球循环赛分治算法c语言,【算法作业】 循环赛问题 分治算法
题目:
设有N个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表
(1)每个选手必须与其他n-1个选手各赛一次
(2)每个选手一天只能赛一次
(3)当n是偶数,循环赛进行n-1天,当n是奇数,循环赛进行n天。
思路分析:
如果n是奇数,其实就等于n+1种情况下将第n+1号选手轮空。所以只要考虑n是偶数的情况。用分治的思想来做,转换成n/2的子问题。考虑两种情况:
一、n/2为偶数。这种情况比较简单。例如n=4时。
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
可由n=2的子问题推出。
1 2 1 2 3 4
2 1 2 1 4 3
1 2 3 4 3 4 1 2
2 1 -->4 3 --> 4 3 2 1
第一次变换下半部分=上半部分+n/2,第二次沿对角线对称。
二、n/2为奇数。由于n/2是奇数,子问题考虑n/2+1的情况。怎么由n/2+1的情况推出n的情况?
例如n=6时。先考虑它的子问题n=4时
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
由于四号选手是非法的所以:
1 2 3 0
2 1 0 3
3 0 1 2
同理推出
1 2 3 0
2 1 0 3
3 0 1 2
4 5 6 0
5 4 0 6
6 0 4 5
对第四列(第三天),只有一号选手和四号选手没比赛,那就让他们比。推出
1 2 3 4
2 1 5 3
3 6 1 2
4 5 6 1
5 4 2 6
6 3 4 5
之后的两天,考虑为比过的两位选手比赛就行了。比赛的顺序按未比赛的后几个选手顺序取模。例如前三天出现了4那后两天为5 6。前三天出现了5后两天为6 4。
如此处理即可得到
1 2 3 4 5 6
2 1 5 3 6 4
3 6 1 2 4 5
4 5 6 1 2 3
5 4 2 6 3 1
6 3 4 5 1 2
#include
#include
#include
#include
using namespace std;
int mp[1100][1100];
void dfs(int n)
{
if(n==1)
{
mp[1][1]=1;
return ;
}
if(n&1) n++;
int t=n/2;
dfs(t);
for(int i=1;i<=t;i++)
for(int j=1;j<=t+1;j++)
{
if(mp[i][j]>t)
{
mp[i+t][j]=i;
mp[i][j]=i+t;
int c=i+t+1;
for(int k=t+2;(t&1)&&k<=n;k++,c++)
{
if(c==i+t) c++;
if(c>n) c-=n/2;
mp[i][k]=c;
mp[c][k]=i;
}
}
else
{
mp[i+t][j]=mp[i][j]+t;
if((t%2==0)||t==1)
{
mp[i+t][j+t]=mp[i][j];
mp[i][j+t]=mp[i+t][j];
}
}
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(mp,0,sizeof(mp));
if(n&1) dfs(n+1);
else dfs(n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+(n&1);j++)
{
cout<n?0:mp[i][j]);
cout<
}
cout<
}
cout<
}
}
网球循环赛分治算法c语言,【算法作业】 循环赛问题 分治算法相关推荐
- 【数据结构与算法——C语言版】1. 数据结构与算法简介
概念 数据结构:"一组数据的存储结构" 算法:"操作数据的一组方法" 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 简言之,在编程实践中,我们可能 ...
- php 红包算法,PHP语言:实现微信红包拆分算法
本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. · 修复最后一个红包输出未保留2位数 · 修复领取的红包金额低于最小红包限制 * 红 ...
- 人工免疫算法c语言实例,毕业设计_蚁群算法模拟系统的设计与实现.doc
J I A N G S U U N I V E R S I T Y 本 科 毕 业 论 文 蚁群算法模拟系统的设计与实现 Ant Colony Simulation System Design and ...
- 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...
本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...
- 机械臂运动学算法c语言,6轴工业机械臂运动学算法(C++) 六轴机械臂运动学源码 - 下载 - 搜珍网...
6轴工业机械臂运动学算法 6轴工业机械臂运动学算法\.cproject 6轴工业机械臂运动学算法\.project 6轴工业机械臂运动学算法\.settings 6轴工业机械臂运动学算法\.setti ...
- 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf
快速约束极值子空间跟踪算法_魏志强 34 4 Vol. 34 No. 4 第 卷第 期 华 北 水 利 水 电 学 院 学 报 2013 8 Journal of North China Instit ...
- pbkdf2 算法 C语言实现,密码学基础之PBKDF2算法
站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值.简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题. PBKDF2 需要以下输入 ...
- 快速pow算法c语言_嵌入式必知基础算法(二)
七.二分法 在一个数组中,知道一个数值,想确定他在数组中的位置下标,如数组:A[5] = {1,2,6,7,9};我知道其中的值为6,那么他的下标位置就是3. 八.限幅滤波法 对于随机干扰 , 限幅滤 ...
- c语言顺序查找算法,c语言实现排序和查找所有算法
c语言版排序查找完成,带详细解释,一下看到爽,能直接运行看效果. /* Note:Your choice is C IDE */ #include "stdio.h" #inclu ...
- 异或校验算法 c语言程序,C# 异或校验算法
C# 的异或校验算法 直接上代码 public partial class FormCRC : Form { public FormCRC() { InitializeComponent(); } p ...
最新文章
- Git各指令的本质,真是通俗易懂啊
- python多线程网络编程_python之网络编程-多线程
- 等式约束和不等式约束下的KKT条件求法
- Java Singleton设计模式
- 我喜欢的一首歌--《幸福的瞬间》
- Mysql count 的多种使用方式性能比较
- iframe内容适应div大小_使用lt;iframegt;方式在WordPress中插入视频并自适应屏幕尺寸
- /usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory 报错解决
- 剑指offer面试题[41]-和为s的两个数VS和为s的连续正数序列
- CSS3 详细新增内容
- HTML5程序设计 SVG
- php有的图片显示不出来,图片显示不出来,但是数据库里有显示
- 翻页电子书/电子画册制作工具
- 计算机ppt实验报告总结怎么写,ppt实验报告总结.doc
- 第三只眼与另一个世界
- 苹果怎么换行打字_通过这 684 关小游戏,你的打字速度可以赢过专业录入员
- 怎样使用NetFlow分析网络异常流量一
- 乔迁之喜!泛微软件园启用,欢迎新老朋友来坐坐
- 图像中的天空区域检测!
- 【ROS】Ubuntu18.04 + ROS操作系统安装