循环比赛

## 问题:

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

题目理解

                                                                                                                                                                                                 也就是有$n=2^m$个选手,每名·


我们不看比赛规则啥的,就下面那个8*8的图,其规律是很明显的,我的分析思路如下:

  1. n=1时,一共两个人,设他们是1号和2号,第一行的第一个数是1,第二个是2,下面就是对称过来,两个人不太明显,看四个人时。
    1221\begin{matrix} 1 & 2\\ 2 & 1 \\ \end{matrix} 12​21​

  2. n=2时,一共四个人,这时前两行两列的元素(左上角12;21)正好是n=1时的那些。最大分组是两个一组,再复制。他俩之间是差2
    要复制两次

n = 3时,有8个人,这时前两行两列的元素(左上角1234;4321)正好是n=2时的那些,他俩之间数值差4,下面每行也能看到差值。


规律是很明显的,主要是怎么写代码。
我一开始是从n=3入手的,但写着写着改不出bug了,所以从n=1时开干。
就俩人很简单,构造完2*2的列表后,因为第一个数固定是1,所以直接加就行。

a[0][1] = a[0][0]+1
a[1][0] = a[0][1]
a[1][1] = a[0][0]

n=2时,肯定不能再直接加了,2是在1的基础上搭建的,所以还是先建1,但这里得加循环了,我们可以用h来作为中间量,一开始h为1,因为差为1;n=1时h应该为2,因为差为2;n=2时h=4因为差为4。这样就可以在循环之前定义一个h=1,然后循环一次乘个2就能实现了。

具体怎么循环呢?

按行按列循环是肯定得有的,还应该有个按复制次数循环,因为是从n=1开始的,先循环生成一个小的,再生成第二小的,反复生成;
最终:

h = 1  # 当前方阵的大小
n = 2
# 构造二维数组
a = []
for q in range(2**n):a.append([])for w in range(2**n):a[q].append(1)
for k in range(n):for i in range(h):for j in range(h):a[i][j+h] = a[i][j]+h  # 右上a[i+h][j] = a[i][j+h]  # 左下a[i+h][j+h] = a[i][j]  # 右下h *= 2
for i in a:print(*i)
#include<iostream>
using namespace std;
int n=3;
int a[8][8];
int h = 1;
int main(){a[0][0] = 1;for (int p=0;p<n;p++){for (int i=0;i<h;i++){for (int j=0;j<h;j++){a[i][j+h] = a[i][j] +h;a[i+h][j] = a[i][j+h];a[i+h][j+h] = a[i][j];}}h = h*2;}for (int q=0;q<h;q++){for (int w=0;w<h;w++){cout<<a[q][w];}cout<<endl;}
}

说的不是很明白,看看代码就能看懂了,有时间出个视频讲讲吧。确实代码很简单,写起来可能不太好写。

卷王李富贵算法每日一题--分治算法(四)--循环比赛相关推荐

  1. 卷王李富贵算法每日一题--分治算法(三)--逃亡

    逃亡 如图1.2所示,设两人分别为甲.乙,则最优方案应该是甲先乘车到达C后下车步行,小车回头接已经走到E的乙,假设在 D相遇,乙乘车到达B时正好甲也步行到达,这样花费的时间最短. 分治算法 v1 是人 ...

  2. 算法每日一题--分治算法(二)-李富贵要上岸985

    题目:魔法石的诱惑 分析一 想要做出这个题,首先得知道:给定一个正整数n,怎么快速计算出n的阶乘尾部0的个数 这种题嘛,主要是找规律,找出规律来后就很简单了.ok,先想想,阶乘最后有0,如果一个偶数和 ...

  3. 算法每日一题--分治算法(一)-李富贵要上岸985

    文章目录 前言 注 分治算法(一) 例题一:二分查找(折半查找) 递归法 踩坑 非递归 前言 之前主要是学人工智能相关的知识,从Python基础到数据分析到人工智能等等,那些知识一般是用到了,学习的过 ...

  4. 2022AcWing寒假算法每日一题之2058. 笨拙的手指

    2022AcWing寒假算法每日一题之2058. 笨拙的手指 题目链接:AcWing2058. 笨拙的手指 思路: 1.数据范围为0-1e9,则输入的时候按照字符串输入 2.将二进制和三进制各位数上的 ...

  5. 【备战蓝桥】 算法·每日一题(详解+多解)-- day1

    [备战蓝桥] 算法·每日一题(详解+多解)-- day1 ✨博主介绍 什么是蓝桥杯 第一题: 第二题 第三题 第四题 第五题 第六题 第七题

  6. 【备战蓝桥杯】 算法·每日一题(详解+多解)-- day11

    [备战蓝桥杯] 算法·每日一题(详解+多解)-- day11 ✨博主介绍 前言 Dijkstra 算法 流程 网络延迟时间 解题思路 Bellman-Ford 算法 流程 K 站内最便宜的航班 解题思 ...

  7. 哈工大(威海)算法实验一:分治算法实验大作业

    哈工大(威海)算法实验一:分治算法实验大作业 题目 某一高等院校有汽车学院.材料学院.计算机学院.软件学院:每个学院的一年级第一学期都开英语.高数.线代课程.每个学院每学期的成绩已经分别登录在同一个E ...

  8. C#LeetCode刷题-分治算法

    分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

  9. java分治_【Java算法】什么是分治算法?

    1.什么是分治算法? 分治法(Divide-and-Conquer)是一种很重要的算法. 分治就是"分而治之"的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子 ...

最新文章

  1. 二叉搜索树c/c++代码实现
  2. 超强1000个jquery极品插件!(连载中。。。。最近更新20090710)
  3. 学习Python不错的网站
  4. Flutter ------- WebView加载网页
  5. 《Swift开发实战》——第16章,第16.2节下标脚本用法
  6. Linux 本地密码正确无法登录,记一次无法正常本地登陆Linux服务器(确定密码正确)...
  7. SQL之用户自定义函数
  8. jboss esb 学习笔记与html的传输,Jboss_ESB学习笔记1.doc
  9. 【整理】Laravel中Eloquent ORM 关联关系的操作
  10. java html对象属性_java中对象属性可以是另外一个对象或对象的参考
  11. 内卷严重?给程序员的几条建议
  12. C语言实现通讯录初版
  13. 华为android phone 驱动,Huawei 手机 驱动程序下载——更新 Huawei 软件
  14. 监督学习、无监督学习、弱监督学习、半监督学习、强化学习概念
  15. 前端之ps的基本操作
  16. 用户分析(AARRR)
  17. PHP - 命名空间(namespace)概述及实例说明
  18. 优秀计算机基础微课案例,大学计算机基础——大学微课实用案例教学
  19. 2015-2016-1 学期《软件工程》第4次作业
  20. SE14 激活并调整数据库

热门文章

  1. gm21模型python_python使用GM11
  2. 【linux】kali 创建应用程序桌面图标(以burpsuite为例)
  3. springboot+flowable第四节(设置监听事件)
  4. 求平均数、百分率、最大值、最小值、两个字段相差秒数的SQL
  5. linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...
  6. c# 多线程实现ping 多线程控制控件
  7. 小程序中字符串转数组如何实现
  8. 如果人类的历史共有100万年,假设这等于一天
  9. 腾讯优图提出LCVR-MQVI算法,勇夺NTIRE 2021双赛道冠亚军
  10. Transformer又又来了,生成配有音乐的丝滑3D舞蹈,开放最大规模数据集AIST++