问题描写叙述:

设有n(n=2^k)支队伍參加循环赛,循环赛共进行n-1天,每支队伍要与其它n-1支队伍比赛一场,
且每支队伍每天必须比赛一场,不能轮空。试按此要求为比赛安排日程。

算法思路:

   我们先安排奇数下标位置与偶数下标位置之间的比赛,就有n/2场,方法非常easy,team[2k]=2k,全部奇数号组成一个序列[1,3...n-1],然后循环移动n/2-1次(比方第2个序列就是[3,5...n-1,1]),然后将该序列填充在team的奇数位置上。
   接下来将队伍一分为二,奇数为一组,偶数为一组,分配安排其内部比赛(由于奇偶数之间前面已经安排过了啦)。以奇数组[1,3,5,7]为例(以n=8为例说明),我们仍然先安排奇数下标位置与偶数下标位置之间的比赛,也就是[15]与[37]之间的比赛,共同拥有2场(n/4)。
   接下来,再将队伍一分为二,得到[15],[37],[04],[26],对每一部分,仍然是先安排奇数下标位置与偶数下标位置之间的比赛,共1场(n/8)。此时已不可再分出子队伍,计算结束。

对照赛安排编号:

从前文的分析能够看出,我们产生比赛日程安排是有规律可循,
先产生n/2,然后是n/4,...直到最后1场。因为n=2^k,
那么这些安排场次总数为2^(k-1)+2^(k-2)...+1=2^k-1=n-1,
恰好相符(其实是必定的)。
这样,对于给定一个编号id,我们首先能够判定相应场次安排须要进行几次队伍分裂。
方法非常easy,比如n=8,id=6,因为一次分烈得到n/2=4场,再次分裂可得n/4=2场,于是两次分裂就可以。
同一时候id-4=2,也就是说两次分裂后的第2个赛场安排,这个2用于对子队伍移位计算使用。

图示

代码

#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<math.h>
using namespace std;string transform(int num)
{bool add = false;if (num < 10) {add = true;}stack<char> temp_stack;int temp_num;while (num != 0){temp_num = num % 10;num /= 10;char temp_char = '0' + temp_num;temp_stack.push(temp_char);}string str;if (add) {str += '0';}while (!temp_stack.empty()){str += temp_stack.top();temp_stack.pop();}return str;
}void game(vector<int> arr, int day, vector<vector<string>> &result)
{int len = arr.size() / 2;for (int i = 0; i < len; i++){for (int k = 0; k < 2 * len; k += 2){string str;str += transform(arr[k]);str += "--";str += transform(arr[k + 1]);result[day + i].emplace_back(str);}if (i == len - 1){break;}int rear = arr[0];for (int j = 0; j < arr.size() - 2; j += 2){arr[j] = arr[j + 2];}arr[arr.size() - 2] = rear;}if (len == 1){return;}vector<int> left(len), right(len);for (int i = 0; i < len; i++){left[i] = arr[2 * i];right[i] = arr[2 * i + 1];}day += len;game(left, day, result);game(right, day, result);
}void print(vector<vector<string>> &result)
{cout<<"循环赛日程安排为:"<<endl<<endl;for (int i = 0; i < result.size(); i++){cout<<'[';printf("%2d", i);cout<<"]    ";for (int j = 0; j < result[0].size(); j++){cout<<result[i][j]<<"  ";}cout<<endl;}
}int main()
{cout<<"共有2~K个选手进行网球循环赛,请输入次方K:"<<endl;int k;cin>>k;int sum = (int) pow((double) 2, (double) k);vector<int> arr(sum);for (int i = 0; i < sum; i++){arr[i] = i + 1;}vector<vector<string>> result(sum - 1);game(arr, 0, result);print(result);return 0;
}//输入案例
//4

博文参考链接

循环赛日程安排问题(分治法)相关推荐

  1. 循环赛 c语言,循环赛日程安排问题(分治法)

    问题描述: 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. 按此要求,可将比赛日程表设计成一 ...

  2. 循环赛日程安排(C语言)

    问题: (先声明一点,下面我写了两种代码,但是都只能满足 队伍数 = 2的幂次方 的情况) 一年一度的欧洲冠军杯马上就要打响,在初赛阶段采用循环制,设共有n队参加,初赛共进行(n-1)天,每队要和其他 ...

  3. 分治法:循环赛日程安排问题

    问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次: 2)每个选手一天只能赛一次. 分析,按照上面的要求,可以将比赛表设计成一个n行 ...

  4. 循环赛赛程表的分治法实现

    目录 一.问题介绍 二.算法思想: 1.分治法的基本思想 2.问题规模扩大的算法思想: 3.填充算法思想 三.算法思想C语言描述 1.非递归法: 2.递归调用的方法: 一.问题介绍 设有n=2k(k= ...

  5. java 循环赛问题_算法——循环赛日程安排问题

    一.问题背景 设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: ①每个选手必须与其他n-1个选手各赛一次: ②每个选手一天只能赛一次. 二.问题分析 按此要求,可将比赛日程表 ...

  6. 循环赛日程安排(构造、分治)

    问题描述 N支队伍进行比赛,要求: 任意两支队伍交且仅交过一次手 每天每支队伍至多打一场比赛 比赛尽快完成 问题等价于构造一个N×M矩阵,表示N支队伍比赛M天,第一列固定为1到N,表示每支队伍的编号, ...

  7. 【C语言】【分治算法】循环赛日程安排问题

    题目要求 设有 n = 2 k n=2^{k} n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次. ...

  8. 分治法之循环赛日程表

    问题描写叙述:             设有n(n = 2^k)位选手參加网球循环赛,循环赛共进行n-1天,每位选手要与         其它n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空 ...

  9. chatGPT教你算法(4)——分治法

    0. 引言 在计算机科学中,分治法是一种用于解决复杂问题的常用方法.它的核心思想是将大问题分解为若干个规模较小的子问题,递归地解决这些子问题,最后再将它们的结果组合起来得到原问题的解. 本博客将向大家 ...

最新文章

  1. python--安装PIL
  2. 美国12大科技公司如何参与自动驾驶?
  3. C++纯虚函数和抽象类
  4. 推荐搜索系统论文干货集锦(持续更新)
  5. dnf上海2服务器维护,DNF上海2出现大面积盗号并迅速蔓延请注意
  6. 阿里巴巴矢量图标库 iconfont 的使用方法
  7. c语言编程图形并颜色,C语言图形编程(三、绘图函数1)
  8. win10右键卡顿原因_Win10桌面点右键一直卡顿转圈怎么解决
  9. 关于STC单片机“假死”状态的判别和处理方法
  10. 网络中的IP地址(包括私网地址)
  11. 微信群活码,一个能够将用户自动分流的工具
  12. zed相机拆机_TX1入门教程硬件篇-外接双目相机ZED
  13. User-Agent反爬虫的原理和绕过方法
  14. 2020数学建模国赛(B)穿越沙漠
  15. 计算机搜索功能关闭,提高电脑性能关闭Windows Search搜索功能设置技巧
  16. php 刀客友朋,说好的英雄拯救世界
  17. Harris角点特征提取和角点特征匹配(2)
  18. docker容器虚拟技术
  19. 工作中提高工作效率的几个思维模式
  20. 萌新的linux之旅 find

热门文章

  1. 2345文件粉碎,文件强力删除工具无捆绑纯净提取版
  2. 盛天海科技:拼多多怎么提高转化?
  3. CG-34 浊度传感器 简单说明
  4. java bll dal_实体框架DAL,BLL与存储库模式
  5. 如何将收件箱中的发件人批量导入企业云邮通讯录
  6. 委内瑞拉将向OPEC推出Petro币用于国际石油交易
  7. ROS2GO+Cozmo=口袋机器人之人工智能仿真和实验平台
  8. 太极阳必须要root吗_root手机教程
  9. (论文解读)RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
  10. java构建网页_从网页搭建入门Java Web2018版