循环赛之分治策略

本文介绍了如何运用分治法为N个运动员安排单循环比赛日程,详细解析了当运动员人数为偶数和奇数时的比赛安排策略,并通过递归分解和循环队列展示了具体的解决方案,最后探讨了算法的时间复杂度。
摘要由CSDN通过智能技术生成

师说要用分治思想解决,在网上找了都讲解的不是很明白,比赛对数为奇数时,有点费解。不过最后还是想明白了,顺便把作业放这,有兴趣了解的可以看一下,逃)

问题:

有N个运动员进行单循环赛,即每个运动员要和所有其他运动员进行一次比赛。
1.试用分治法为N个运动员安排比赛日程。
2.要求每个(或队)运动员每天只能进行一场比赛,且当运动员人数(队数)为偶数时,整个比赛在N-1天内结束,为奇数时,在N天内结束;
3.将运动员从1到N编号。

思路:
我们用表格的方式来表示循环赛的日程安排,最左边的一列表示队号,每一行表示相应队比赛每天的对手,即a[i][j]表示第i队第j天的对手。
我们从两个队的比赛开始,并发现其中规律:


其中,四队的表格可以从两队的表格产生的:

但这只能解决2的幂的队数的循环赛日程。

为了解决更普遍的队数,我们考虑队数为偶数时,它必然可以被2整除,商为偶数或奇数。商为偶数可以用上面的方法得到结果,商为奇数时,就不行了。
我们先来看一个例子,队数为6时,它的一半为3,是奇数,不能用上面的方法,我们先考虑它的子问题:队数为4时,就是上面求出的结果了,我们要从队数4产生6的结果:

我们可以看到后3行其实和前3行是一样的,只是编号变了而已。为了让编号在6以内,我们要改变编号7的对应情况,可以看出编号7是由编号4产生的,所以我们只要让它们相对的队组成一队

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值