一.要求

用分治法实现循环赛:

一共有n个选手要进行循环赛,请设计一个满足以下要求的比赛日程表:

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

(2)每个选手一天只能赛一次;

(3)当n 是偶数,循环赛进行n-1天,当n是奇数,循环赛进行n天。

按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。

二.设计思路

总共需要进行n*(n-1)/2场比赛。

当有偶数个选手参加比赛时需要进行n-1天比赛。当有奇数个选手时会出现轮空现象,考虑n+1个选手参加比赛的日程安排,最后将多出来的选手对应的比赛轮空,一共需要进行(n+1)-1天比赛。由此推测,不论参加选手人数为偶数还是奇数,统一处理为偶数考虑。

当n/2为偶数时,通过对子问题矩阵元素的平移即可得到。如下图所示:

当n/2为奇数时,首先将子问题处理为n/2+1的情况,再扩充矩阵,以六名选手为例,如下图所示:

三.程序主体

# coding=utf-8
from numpy import *
def compettion(n,mymat):if n==2:mymat[0,0]=1mymat[0,1]=2mymat[1,0]=2mymat[1,1]=1return#分治迭代至只有2名运动员# if n%2==1:n+=1#奇数# t=int(n/2)if n % 2 == 1:t=int((n+1)/2)n+=1else:t=int(n/2)compettion(t,mymat)#分治迭代#在原先的基础上,扩展矩阵if n%4==0:#除以2为偶数个运动员for i in range(int(n/2)):for j in range(int(n/2)):thevalue=mymat[i][j]mymat[i+t][j]=thevalue+tmymat[i][j+t]=thevalue+tmymat[i+t][j+t]=thevalueelse:#除以2为奇数个运动员for i in range(int(n/2)):#截取部分子问题的解for j in range(int(n/2)+1):thevalue=mymat[i][j]if thevalue>t:#子问题中假设出的选手##用以下两行解决奇数个运动员时矩阵的左半部分mymat[i+t][j]=i+1##########################下左假设部分恰好为i+1mymat[i][j] =i+t+1#新假设出的选手处正好为i+t+1##需要处理矩阵k列开始的右半部分c=i+t+2#第一个是5k=int(n/2)+1#第一个是4while k<n:if c>n:c-=t#if(c==i+t)  c++;mymat[i][k]=c#右mymat[c-1][k]=i+1#右下c+=1k+=1else:mymat[i+t][j]=thevalue+t#向下延拓return mymat#################################################################
def main():a =int(input("输入需要进行循环赛的人数:"))if a%2==0:#运动员人数为偶数b = zeros([a, a])compettion(a, b)else:#运动员人数为奇数b = zeros([a+1, a+1])compettion(a+1, b)for i in range(a+1):for j in range(a+1):if b[i][j]>a:b[i][j]=0if i ==a:b[i][j]=0print(b)if __name__ == '__main__':main()

四.运行结果

2名选手:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exeC:/Users/Administrator/PycharmProjects/untitled1/xunhuansai.py

输入需要进行循环赛的人数:2

[[ 1. 2.]

[2.  1.]]

Process finished with exit code 0

3名选手:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exeC:/Users/Administrator/PycharmProjects/untitled1/xunhuansai.py

输入需要进行循环赛的人数:3

[[ 1. 2.  3.  0.]

[2.  1. 0.  3.]

[3.  0. 1.  2.]

[0.  0. 0.  0.]]

Process finished with exit code 0

4名选手:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exeC:/Users/Administrator/PycharmProjects/untitled1/xunhuansai.py

输入需要进行循环赛的人数:4

[[ 1. 2.  3.  4.]

[2.  1. 4.  3.]

[3.  4. 1.  2.]

[4.  3. 2.  1.]]

Process finished with exit code 0

5名选手:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exeC:/Users/Administrator/PycharmProjects/untitled1/xunhuansai.py

输入需要进行循环赛的人数:5

[[ 1. 2.  3.  4. 5.  0.]

[2.  1. 5.  3.  0.  4.]

[3.  0. 1.  2.  4.  5.]

[4.  5. 0.  1.  3.  2.]

[5.  4. 2.  0.  1.  3.]

[0.  0. 0.  0.  0.  0.]]

Process finished with exit code 0

6名选手:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exeC:/Users/Administrator/PycharmProjects/untitled1/xunhuansai.py

输入需要进行循环赛的人数:6

[[ 1. 2.  3.  4. 5.  6.]

[2.  1. 5.  3.  6.  4.]

[3.  6. 1.  2.  4.  5.]

[4.  5. 6.  1.  3.  2.]

[5.  4. 2.  6.  1.  3.]

[6.  3. 4.  5.  2.  1.]]

Process finished with exit code 0

六.结果分析

五名选手及六名选手的结果分别为:

其中第一列为选手序号,第二列为第一天进行比赛的对手,第三列为第二天进行比赛的选手。。。当对手序号为0时,表示当天该选手轮空。

经过对比,5名选手的比赛安排是在6名选手的比赛安排上去掉涉及第6名选手的比赛。运行结果和预先的思路相符。

 

python应用——分治法实现循环赛相关推荐

  1. 分治法解决循环赛日程表

    分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...

  2. 分治法求循环赛日程表

    设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)循环赛一共进行n-1天. 按要求可将 ...

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

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

  4. python 实现分治法的几个例子

    分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质.3) 利用该问题分解出的子问题 ...

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

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

  6. 分治法之循环赛日程表的理解和解题思路

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

  7. Python算法——分治法查找数组中元素最小最大值

    要求: 给定数组a1,a2,a3,...an,找出数组中最大值和最小值.(数组中两两各不相同) 分析: 算法思想类似于上图,将数组两两分为一组,如果数组元素奇数个,就把最后一个元素单独分为一组,然后分 ...

  8. python求最大值代码的方式_python使用分治法实现求解最大值的方法

    本文实例讲述了python使用分治法实现求解最大值的方法.分享给大家供大家参考.具体分析如下: 题目: 给定一个顺序表,编写一个求出其最大值和最小值的分治算法. 分析: 由于顺序表的结构没有给出,作为 ...

  9. PYTHON:大整数乘法(分治法)

    何为分治法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标完成程序算法,简单问题可用二分法 ...

最新文章

  1. poj 2559 Largest Rectangle in a Histogram 栈
  2. 美卫星拍最详细3D地图 覆盖地球99%大陆
  3. leetcode50. Pow(x, n)
  4. Zookeeper的Windows安装
  5. Python实用笔记 (2)list和tuple
  6. 大数据hadoop资源网址
  7. 运动并不是最好的减肥办法,控制饮食也不是
  8. 如何系统地学习深度学习(从初级到高级,初学者必看)
  9. 流计算精品翻译: The Dataflow Model
  10. nginx + tomcat配置负载均衡
  11. 代码管理学:如何给新员工安排工作
  12. dp 20190617
  13. matlab abort,matlab自动关闭是怎么回事???
  14. 蓝桥杯C++深度优先搜索(dfs)之组队,迷宫,走方格
  15. 2022年河南省焊工高级技师理论知识模拟试题及答案
  16. linux系统下深度学习环境搭建和使用
  17. dnf跨6服务器维护,地下城与勇士DNF2018全跨区表一览
  18. JavaScript进阶(三)
  19. 如何用工业智能网关/数据采集器采集西门子PLC
  20. 圆弧方向判断方法和三点确定一个圆的计算方法

热门文章

  1. 阿里云国际版如何使用NGINX作为HTTPS转发代理服务器
  2. 一文带你看懂TCP/IP协议 (更新中 现更新至网络层部分)
  3. 干货满满【JVM监控及诊断工具-GUI篇】
  4. eslint搭配prettier出现Replace `XXX` with `··········XXX·······`的问题解决方法
  5. 如何让自己打计算机打字快起来,电脑快速打字的技巧
  6. RAP开发入门-运行过程简析(三)
  7. 追加贷显示服务器出错,小蜜蜂财务软件常见问题汇总
  8. 小米手环NFC 模拟门禁卡 不买东西最简解决方案(100字)
  9. 穆穆推荐-软件销售行业软件公司销售参考操作手册--之1--公司软件产品的定位分类以及目标客户定位-待续....
  10. 穆利堂[推荐]WxCSM客户服务整体解决方案-河南郑州房地产客户服务管理系统软件-穆穆-movno1