python应用——分治法实现循环赛
一.要求
用分治法实现循环赛:
一共有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应用——分治法实现循环赛相关推荐
- 分治法解决循环赛日程表
分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...
- 分治法求循环赛日程表
设有n=2^k个运动员要进行网球循环赛.现要设计一个满足以下要求的比赛日程: (1)每个选手必须与其他n-1个选手各赛一次: (2)每个选手一天只能赛一次: (3)循环赛一共进行n-1天. 按要求可将 ...
- 分治法:循环赛日程安排问题
问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表: 1)每个选手必须与其它n-1个选手各赛一次: 2)每个选手一天只能赛一次. 分析,按照上面的要求,可以将比赛表设计成一个n行 ...
- python 实现分治法的几个例子
分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质.3) 利用该问题分解出的子问题 ...
- 分治法之循环赛日程表
问题描写叙述: 设有n(n = 2^k)位选手參加网球循环赛,循环赛共进行n-1天,每位选手要与 其它n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空 ...
- 分治法之循环赛日程表的理解和解题思路
一. 问题: 设有n=2^k个运动员,要进行网球循环赛.现在要设计一个满足以下要求的比赛日程表 (1)每个选手必须与其他n-1个选手各赛一场 (2)每个选手一天只能赛一次 (3)循环赛一共进行n-1天 ...
- Python算法——分治法查找数组中元素最小最大值
要求: 给定数组a1,a2,a3,...an,找出数组中最大值和最小值.(数组中两两各不相同) 分析: 算法思想类似于上图,将数组两两分为一组,如果数组元素奇数个,就把最后一个元素单独分为一组,然后分 ...
- python求最大值代码的方式_python使用分治法实现求解最大值的方法
本文实例讲述了python使用分治法实现求解最大值的方法.分享给大家供大家参考.具体分析如下: 题目: 给定一个顺序表,编写一个求出其最大值和最小值的分治算法. 分析: 由于顺序表的结构没有给出,作为 ...
- PYTHON:大整数乘法(分治法)
何为分治法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解.即一种分目标完成程序算法,简单问题可用二分法 ...
最新文章
- poj 2559 Largest Rectangle in a Histogram 栈
- 美卫星拍最详细3D地图 覆盖地球99%大陆
- leetcode50. Pow(x, n)
- Zookeeper的Windows安装
- Python实用笔记 (2)list和tuple
- 大数据hadoop资源网址
- 运动并不是最好的减肥办法,控制饮食也不是
- 如何系统地学习深度学习(从初级到高级,初学者必看)
- 流计算精品翻译: The Dataflow Model
- nginx + tomcat配置负载均衡
- 代码管理学:如何给新员工安排工作
- dp 20190617
- matlab abort,matlab自动关闭是怎么回事???
- 蓝桥杯C++深度优先搜索(dfs)之组队,迷宫,走方格
- 2022年河南省焊工高级技师理论知识模拟试题及答案
- linux系统下深度学习环境搭建和使用
- dnf跨6服务器维护,地下城与勇士DNF2018全跨区表一览
- JavaScript进阶(三)
- 如何用工业智能网关/数据采集器采集西门子PLC
- 圆弧方向判断方法和三点确定一个圆的计算方法
热门文章
- 阿里云国际版如何使用NGINX作为HTTPS转发代理服务器
- 一文带你看懂TCP/IP协议 (更新中 现更新至网络层部分)
- 干货满满【JVM监控及诊断工具-GUI篇】
- eslint搭配prettier出现Replace `XXX` with `··········XXX·······`的问题解决方法
- 如何让自己打计算机打字快起来,电脑快速打字的技巧
- RAP开发入门-运行过程简析(三)
- 追加贷显示服务器出错,小蜜蜂财务软件常见问题汇总
- 小米手环NFC 模拟门禁卡 不买东西最简解决方案(100字)
- 穆穆推荐-软件销售行业软件公司销售参考操作手册--之1--公司软件产品的定位分类以及目标客户定位-待续....
- 穆利堂[推荐]WxCSM客户服务整体解决方案-河南郑州房地产客户服务管理系统软件-穆穆-movno1