循环赛日程表算法分析c语言,循环赛日程表
该算法的核心问题是合并问题,因为把一个数分成2半,可能得到2种情况:①等分;②一组比另一组多一人;在这里我们巧妙的设计了一下,当一组比另一组多一人时,我们假设了一个虚拟选手,让他参与匹配,最后再把出现虚拟对手的位置置为0,表示这个位置对应的选手当天没有比赛:
/*
* 循环赛日程表.cpp
* Author: Au酱
* Date:2013-04-12
*/
#include
#include
#include
#include
using namespace std;
const int MAX_NUM = 100;
int A[MAX_NUM+2][MAX_NUM+2];
/* 合并子问题 */
void merge(int n)
{
/*
* n 为偶数时,比赛 n - 1 天
* n 为奇数时,比赛 n 天
*/
int days = n % 2 == 0 ? n - 1 : n;
/*
* 中间值,若n为奇数,则使 m = (n / 2) + 1,
* 即,前半部分不小于后半部分
*/
int m = (int)ceil(n / 2.0);
int passd_days = m % 2 == 0 ? m - 1 : m; /* 已经安排的天数 */
/*
* 通过前 n/2 的比赛安排,构造后n/2的比赛安排
* 如果 n 为奇数,则会产生一个虚拟选手
*/
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= passd_days; j++)
{
if (A[i][j] != 0)/* 如果 i 号在第 j 天有对手 */
{
/*
* 那么,(i + m) 号在第 j 天的对手为 i号的
* 对手往后数 m 号
*/
A[i + m][j] = A[i][j] + m;
}
else /* 如果 i 号在第 j 天没有对手*/
{
/*
* 那么就让 i 号和 (i + m)号互为对手
*/
A[i + m][j] = i;
A[i][j] = i + m;
}
}
}
int add_one = 0;/* 稍后说明 */
if (A[1][passd_days] == m + 1)
add_one = 1;
for (int i = 1; i <= m; i++)
{
for (int j = passd_days + 1, count = 0; j <= days; j++, count++)
{
/*
* i 号在第 j 天的对手,通过枚举后半部分的值
* 来进行匹配
*/
int r_value = (count + (i - 1) + add_one) % m + m + 1;
A[i][j] = r_value;
A[r_value][j] = i;
}
}
if ( n % 2 == 1)/* 如果 n 为奇数,消除虚拟的选手 */
{
for (int i = 1; i <= 2 * m; i++)
{
for (int j = 1; j <= days; j++)
if (A[i][j] == n + 1)
A[i][j] = 0;/* A[i][j] = 0 ,表示 i 号选手在第 j 天没有比赛 */
}
}
}
/* 分治求解循环赛问题 */
void tournament(int n)
{
if (n <= 1)
return;
else if (n == 2)/* 2 个选手 */
{
A[1][1] = 2;
A[2][1] = 1;
}
else
{
tournament((int)ceil(n / 2.0));
merge(n);
}
}
/* 打印循环赛日程表 */
void show_result(int n)
{
cout << " " << n << "人循环赛" << endl;
int days;
if (n % 2 == 0)
days = n - 1;
else
days = n;
cout.flags(ios::left);
cout << setw(8) << "";
for (int i = 1; i <= n; i++)
cout << i << setw(4) << "号";
cout << endl;
cout.flags(ios::left);
for (int j = 1; j <= days; j++)
{
cout << "第 " << setw(2) << j << setw(3) << "天";
for (int i = 1; i <= n; i++)
{
cout << setw(5) << A[i][j];
}
cout << endl;
}
cout << endl;
}
int main()
{
cout << "请输入参赛人数(小于100):";
int num;
cin >> num;
tournament(num);
show_result(num);
cout << "Hit any key to close this window.";
_getch();
}
循环赛日程表算法分析c语言,循环赛日程表相关推荐
- 循环赛 c语言,循环赛日程安排问题(分治法)
问题描述: 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表设计成一 ...
- 数据结构与算法分析 C++语言描述第四版.Mark Allen Weiss
数据结构与算法分析 C++语言描述第四版.Mark Allen Weiss 可用于自学数据结构与算法,数据结构与算法分析对于C++的学习至关重要,应该努力掌握好! 百度网盘: 链接:https://p ...
- 《数据结构与算法分析-C语言描述》习题2.6
<数据结构与算法分析-C语言描述>([url=http://users.cis.fiu.edu/~weiss/#dsaac2e]Data Structures and Algorithm ...
- 算法 c语言实现 英文版 pdf,数据结构与算法分析++C语言描述++英文版++..pdf-得力文库...
数据结构与算法分析++C语言描述++英文版++....pdf General Ination 书名数据结构与算法分析 C语言描述 英文版 第2版 作者(美)韦斯著 页数512 出版社机械工业出版社 出 ...
- s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...
<数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...
- c语言 循环赛日程表 n=2^k,循环赛日程表分治算法(c语言)
/* * 设有n=2k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程表: * 每个选手必须与其他n-1个选手各赛一次: * 每个选手一天只能参赛一次: * 循环赛在n-1天内结束. * ...
- 分治法循环赛c语言,循环赛问题分析和C语言代码-分治法.doc
WORD格式整理版 学习好帮手 问题描述:设有n个运动员要进行网球循环赛.设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)当n ...
- 网球循环赛分治算法c语言,【算法作业】 循环赛问题 分治算法
题目: 设有N个运动员要进行网球循环赛,设计一个满足以下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一次 (2)每个选手一天只能赛一次 (3)当n是偶数,循环赛进行n-1天,当n是奇数, ...
- python做项目日程表_Flask框架搭建一个日程表
前言 用Flask框架,SQLalchemy,SQlite 和Vertabelo 搭建一个日程表. 这个并不是最终产品,目的是展示python web开发的流程,欢迎不吝赐教! github下载源码 ...
最新文章
- Git 的安装及配置
- 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
- SUID、SGID、粘滞位
- 3dmax模型导入UE4
- c++ 二次开发 良田高拍仪_高拍仪进行二次开发要求
- 基于PaddleOCR史上最全车牌号识别实现(二)
- MATLAB符号运算小技巧
- 『论文笔记』目标追踪结合相关滤波器资料收集+机器学习基础知识补充!
- PC端微信图片的解密
- 心理咨询类_微信小程序项目实战、含:标注图、效果图、视频、源码
- 二叉树的左视图和右视图
- 网络带宽和速度的关系
- pyshark.tshark.tshark.TSharkNotFoundException: TShark not found.
- java学习笔记————SSH
- 多重纹理——像素着色器
- 计算机科学期刊催稿,SOFT COMPUTING
- 原画设计咨询回复话术
- 使用python脚本和excel对比Telegram多国语言包资源
- Python实战案例,mplcyberpunk模块,Python实现赛博朋克数据可视化
- ppu与spu之间的邮箱通信
热门文章
- 上海市婴幼儿社保卡领取办法
- 哪个网站云服务器最便宜,哪家云服务器比较便宜
- Android 接入融云案例
- [莫比乌斯反演]莫比乌斯函数
- Pycharm报错之“CreateProcess error=2, 系统找不到指定的文件”
- 通用高校排课算法研究
- 什么是软件工程-基础概念
- Python爬虫--人人网模拟登录cookie(四)
- quotacheck: Cannot create new quotafile /data/aquota.group.new: Permission denied
- 魅族回应被吉利收购:已签署协议;腾讯下架QQ影音所有版本;PyPI多个软件包因拼写错误包含后门|极客头条...