1325:【例7.4】 循环比赛日程表

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 8879     通过数: 5227

【题目描述】

设有NN个选手进行循环比赛,其中N=2M2M,要求每名选手要与其他N−1N−1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N−1N−1天,要求每天没有选手轮空。

【输入】

输入:MM。

【输出】

输出:表格形式的比赛安排表。一行各数据间用一个空格隔开。

【输入样例】

3

【输出样例】

1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1

【算法分析】

从八位选手的循环比赛表中可以看出,这是一个具有对称性的方阵,可以把方阵一分为四来看,那么左上角的4*4的方阵就是前四位选手的循环比赛表,而右上角的4*4的方阵就是后四位选手的循环比赛表,它们在本质上是一样的,都是4个选手的循环比赛表,所不同的只是选手编号不同而已,将左上角中方阵的所有元素加上4就能得到右上角的方阵。下方的两个方阵表示前四位选手和后四位选手进行交叉循环比赛的情况,同样具有对称性,将右上角方阵复制到左下角即得到1、2、3、4四位选手和5、6、7、8四位选手的循环比赛表,根据对称性,右下角的方阵应与左上角的方阵相同。这样,八名选手的循环比赛表可以由四名选手的循环比赛表根据对称性生成出来,而两名选手的循环比赛表可以说是已知的,这种程序设计方法叫做分治法,其基本思想是把一个规模为n的问题分成若干个规模较小的问题,使得从这些较小问题的解易于构造出整个问题的解。

程序中用数组a记录n名选手的循环比赛表,整个循环比赛表从最初的1*1的方阵按上述规则生成出2*2的方阵,再生成出4*4的方阵...,直到生成出整个循环比赛表为止。变量mid表示当前方阵的大小,也是要生成的下一个方阵的大小的一半。

【参考程序】

#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e3+10;
inline int fread()
{char ch=getchar();int n=0,m=1;while(ch<'0' or ch>'9'){if(ch=='-')m=-1;ch=getchar();}while(ch>='0' and ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();return n*m;
}
int a[N][N],m,n,i=1,mid=1;
signed main()
{m=fread(),n=1<<m,a[0][0]=1;//1<<m相当于2^mwhile(i<=m){for(int j=0;j<mid;j++)//构造右上方方阵for(int k=0;k<mid;k++)a[j][k+mid]=a[j][k]+mid;for(int j=0;j<mid;j++)//对称交换构造下半部分方阵for(int k=0;k<mid;k++)a[j+mid][k]=a[j][k+mid],/*左下方方阵等于右上方方阵*/a[j+mid][k+mid]=a[j][k];//右下方方阵等于左上方方阵mid*=2,i++;}for(i=0;i<n;i++){for(int j=0;j<n;j++)printf("%d ",a[i][j]);printf("\n");}return 0;
}

给个关注吧

1325:【例7.4】 循环比赛日程表相关推荐

  1. 信息奥赛一本通(1325:【例7.4】 循环比赛日程表)

    1325:[例7.4] 循环比赛日程表 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 6257     通过数: 3483 [题目描述] 设有N个选手进行循环比赛 ...

  2. 1325:【例7.4】 循环比赛日程表——分治

    [题目描述] 设有N个选手进行循环比赛,其中N=2^M,要求每名选手要与其他N−1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N−1天,要求每天没有选手轮空. [输入] 输入:M. [输出] 输 ...

  3. 【例7.4】 循环比赛日程表

    1325:[例7.4] 循环比赛日程表 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 1717     通过数: 901 [题目描述] 设有NN个选手进行循环比赛 ...

  4. 循环比赛日程表(分治 C++)

    循环比赛日程表 总时间限制: 1000ms 内存限制: 65535kB 描述 设有n个选手进行循环比赛,其中n=2m,要求每名选手要与其他n-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行n-1 ...

  5. 循环比赛日程表(match)

    循环比赛日程表(match) #include<bits/stdc++.h> using namespace std; int m,n,a[1005][1005],h[1005][1005 ...

  6. 循环比赛日程表(信息学奥赛一本通-T1325)

    [题目描述] 设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空. [输入] 输入:M. [输出] 输出 ...

  7. 循环比赛日程表(分治法)

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

  8. 不止代码:循环比赛(分治)

    循环比赛日程表(match) [问题描述] 解析 dfs或分治 分治可以不断递归4个小正方形 左上右下为前一半,左下右上后一半 dfs就很无脑了 代码 #include<cstdio> # ...

  9. 分治法解决循环赛事日程表(非常详细!)图文并茂-Java代码实现

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

最新文章

  1. 2019牛客暑期多校训练营(第九场)-E All men are brothers
  2. python list操作说明
  3. SRM614 Div1 Hard
  4. docker公共存储库_Docker实战001:简单的认识下docker
  5. sort函数用于vector向量的排序
  6. 都说如果朋友都是有钱人,你也会更容易发财
  7. java同一程序只运行一次_如何使自己的程序只运行一次
  8. php日历天气预报下载安装手机桌面_手机桌面时钟日历天气
  9. quadro 2000专业显卡 win7计算机体验指数5.9,quadro显卡天梯图小虫_quadro专业显卡天梯图小虫2020年 - 系统家园...
  10. Win7打开方式还原,怎么还原打开方式?
  11. 两张图片怎样合成一张左右拼图?
  12. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS
  13. 怎么配置环境变量?(保姆级教程)
  14. 研究生放假因疫情未按时返回,扣助研补贴!实验室奇葩规定引热议
  15. 自定义键盘KeyboardView如何添加点击音效
  16. MySQL-子查询(嵌套)
  17. RK3568平台开发系列讲解(安卓适配篇)获取 root 权限
  18. 螺丝钉 IT人员 感悟 -- 别让 IT成为金钱的奴隶(希望引起 大家的共鸣)
  19. java语言的编译器命令_Java编译器的命令是( )
  20. Kaggle实战:随机森林预测泰坦尼克生存率

热门文章

  1. OpenWrt设置samba密码
  2. NOR与NAND闪存对比
  3. manifest.xlm配置错误信息
  4. VCM(音圈)马达驱动IC
  5. ft232h引脚_一种基于芯片FT232H的USB接口电路
  6. 30岁遇到发展瓶颈?AI来了,你的职业规划可能才刚刚开始
  7. 关于苹果APP STORE无法连接的问题
  8. 【电商】电商系统---供应商管理
  9. 如何从InfluxDB/OpenTSDB无缝连接到TDengine
  10. cmd52命令发送 mmc_Linux MMC framework(2)_host controller driver