一、问题背景

设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:

①每个选手必须与其他n-1个选手各赛一次;

②每个选手一天只能赛一次。

二、问题分析

按此要求,可将比赛日程表设计成一个n×(n-1)的二维表,其中,(i, j)表示和第i个选手在第j天比赛的选手。

•将所有参赛的选手分为两部分

n=2^k个选手的比赛日程表就可以通过为n/2=2^(k-1)个选手设计的比赛日程表来决定。

•递归地执行这种分割

•直到只剩下2个选手(递归出口)比赛日程表的制定就变得足够简单

只要让这2个选手进行比赛即可

•求解过程是自底向上的迭代过程,其中图(c)左上角和左下角分别为选手1至选手4以及选手5至选手8前3天的比赛日程

•将左上角部分的所有数字按其对应位置抄到右下角,将左下角的所有数字按其对应位置抄到右上角,这样,就分别安排好了选手1至选手4以及选手5至选手8在后4天的比赛日程,如图(c)所示。具有多个选手的情况可以依此类推。

•把求解2k个选手比赛日程问题划分成依次求解21、22、…、2k个选手的比赛日程问题,换言之,2k个选手的比赛日程是在2^(k-1)个选手的比赛日程的基础上通过迭代的方法求得的。

•在每次迭代中,将问题划分为4部分:

①左上角

•左上角为2^(k-1)个选手在前半程的比赛日程;

②左下角

•左下角为另2^(k-1)个选手在前半程的比赛日程,由左上角加2^(k-1)得到,例如22个选手比赛,左下角由左上角直接加2得到,23个选手比赛,左下角由左上角直接加4得到;

③右上角

•将左下角直接抄到右上角得到另2^(k-1)个选手在后半程的比赛日程;

④右下角

•将左上角直接抄到右下角得到2^(k-1)个选手在后半程的比赛日程;算法设计的关键在于寻找这4部分元素之间的对应关系

三、算法描述

void GameTable(int k, int a[ ][ ])

{

// n=2k(k≥1)个选手参加比赛,//二维数组a表示日程安排,数组下标从1开始n=2; //k=0,2个选手比赛日程可直接求得//求解2个选手比赛日程,得到左上角元素a[1][1]=1; a[1][2]=2;

a[2][1]=2; a[2][2]=1;

for (t=1; t

//迭代处理,依次处理22, …, 2k个选手比赛日程 temp=n; n=n*2;

//填左下角元素 for (i=temp+1; i<=n; i++ )

for (j=1; j<=temp; j++)

a[i][j]=a[i-temp][j]+temp;

//左下角元素和左上角元素的对应关系 //填右上角元素 for (i=1; i<=temp; i++)

for (j=temp+1; j<=n; j++)

a[i][j]=a[i+temp][(j+temp)% n];

//填右下角元素 for (i=temp+1; i<=n; i++)

for (j=temp+1; j<=n; j++)

a[i][j]=a[i-temp][j-temp];

}

}

四、时间复杂度分析

迭代处理的循环体内部有3个循环语句,每个循环语句都是一个嵌套的for循环,且他们的执行次数相同,基本语句是最内层循环体的赋值语句,即填写比赛日程表中的元素。基本语句的执行次数是:

故其时间复杂性为O(4^k)。

java 循环赛问题_算法——循环赛日程安排问题相关推荐

  1. 用递归与分治策略求解网球循环赛日程表_算法设计:分治法(比赛日程安排)...

    一.算法思路 1.思路 分治算法的思想是:对于一个规模位N的问题,若该问题可以容易解决(比如规模N较小),则直接解决,否则将其分解为M个规模较小的子问题,这些子问题互相独立,并且与原问题形式相同,递归 ...

  2. java k均值_算法——K均值聚類算法(Java實現)

    1.用途:聚類算法通常用於數據挖掘,將相似的數組進行聚簇 2.原理:網上比較多,可以百度或者google一下 3.實現:Java代碼如下 package org.algorithm; import j ...

  3. java猴子爬山_[算法]猴子爬山

    猴子爬山 问题描述 一只顽猴在一座有50级台阶的小山上爬山跳跃.上山时需要从山脚至山顶往上跳50级台阶,一步可跳2级,或跳3级,或跳4级,求上山有多少种不同的跳法? 下山时从山顶至山脚往下跳50级台阶 ...

  4. java 字符串 移位_算法学习之字符串左移和右移

    1.设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量. 方法一: 每次将数组中的元素右移一位,循环K次,则实现了右移K位. 例如, 原始字符串: ...

  5. java 篮球队淘汰赛_篮球淘汰赛怎么安排 6支篮球队淘汰赛图

    篮球淘汰赛赛制? 建议采用双败赛制吧,12个班的话还是建议设四支种子队,直接进入胜者组第二轮.赛程为(1.胜者组第一轮)8支非种子队两两淘汰.胜者与之前的种子队组成胜者组八强,输了的四支队进入败者组. ...

  6. java号码分身_[算法] 电话号码分身 (小米2017 秋招真题)[JavaScript]

    题目描述 继MIUI8推出手机分身功能,MIUI计划推出一个电话号码分身得功能:首先将电话号码中的每个数字加上8取个位,然后使用对应得大写字母代替 ("ZERO", "O ...

  7. java 鸡尾酒排序_算法渣-排序-冒泡

    没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺:跟着算法渣一起从零学算法 定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 这个算法的名字由来 ...

  8. java 符号三角形_算法java实现--回溯法--符号三角形问题

    符号三角形问题的java实现(回溯法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8764319 /* ...

  9. Java物联网方向_物联网专业课程安排——未来主要方向之一

    课程1. 物联网产业与技术导论 使用电子工业出版社<物联网:技术.应用.标准.安全与商业模式>等等教材. 在学完高等数学,物理,化学,通信原理,数字电路,计算机原理,程序设计原理等课程后开 ...

最新文章

  1. 怒刷web前端笔试面试题(一)
  2. 浅谈千万级PV/IP规模高性能高并发网站架构
  3. python 数据可视化 -- 读取数据
  4. 【Paper】An Experiment Comparing Double Exponential Smoothing and Kalman Filter-Based Predict
  5. SQL Server 预读和物理读 的区别
  6. SpringCloud(1) 架构演进和基础知识简介
  7. selenium(2.4.0)中不能导出web drive 代码
  8. 智能水表营收管理系统
  9. C语言自学之路八(数组(重点)详解)
  10. 把你的桌面变成vista
  11. MC9S中断函数编写
  12. python 伪造源ip_Python实现爬虫设置代理IP和伪装成浏览器的方法共享
  13. 智能对话系统评测标准
  14. 用python实现双人五子棋(终端版)
  15. C# TCP/UDP网络通讯调试助手(含源码)
  16. 楼市十大卖楼花招曝光
  17. 为什么某些网页打不开而别人却能打开?
  18. 微信公众号实现回复图文消息
  19. 2017第七届中国锁业博览会会刊(参展商名录)
  20. 面试必问的性能测试流程,你真的会吗?

热门文章

  1. 菜鸟学习nginx之接收HTTP Header
  2. 川贝母修饰卵清蛋白(Fritillaria thunbergii-OVA/Ovalbumin )
  3. 怎么把文字生成图片?三款ai绘画生成器分享
  4. 5个设计师必备的页面设计工具!
  5. 寒武纪Cambricon MLU270 环境搭建 CNStream EasyDK编译 改变系统路径 CNJPEGENC_FLAG_INVALID_FRAME 错误
  6. QX5241高端检测降压恒流LED驱动器 泉芯电子
  7. c#创建文件夹时无法访问路径,路径拒绝访问
  8. 基于粤嵌gec6818开发板嵌入式电子相册,智能家居,音乐播放,灯光控制,2048游戏
  9. 数字旋转方阵 c++数据结构
  10. cps1 cps2 android,CPS1.CPS2 MVS多机板模拟器FinalBurn for Win