当前位置:首页 > 题解目录 > 正文内容

【题解】循环比赛日程表

亿万年的星光10个月前 (05-30)题解目录670

【题目描述】

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

【输入描述】

输入M

【输出描述】

一个二维数组,表示比赛安排表,一行数据间用一个空格隔开。

【样例输入】

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


【题目分析】

可以采用分治法来解决这个问题。具体步骤如下:

1.基本情况:当 N=2 时,比赛安排很简单:

第一天:选手 1 对选手 2

第二天:选手 2 对选手 1 (因为循环赛是对称的)

2.递归分解:

对于N=2^M, 可以将问题分解为两个N/2的子问题。

先安排前N/2名选手的比赛日程,然后利用对称性安排后N/2名选手的比赛日程。

最后,将两个子问题的解进行合并,填充剩余的比赛安排。

3.合并步骤:

左上角的子矩阵是前N/2名选手的比赛安排。

右上角的子矩阵是前N/2名选手与后N/2名选手的比赛安排,可以通过左上角矩阵加N/2得到。

左下角的子矩阵是右上角子矩阵的对称。

右下角的子矩阵是左上角矩阵的复制。



【参考答案】

#include <bits/stdc++.h>
using namespace std;
int table[1000][1000];
void schedule(int n) {
	if (n == 1) {
		table[0][0] = 1;
		return;
	}
	int half = n / 2;
	schedule(half); // 递归解决子问题

	// 填充右上角
	for (int i = 0; i < half; ++i) {
		for (int j = 0; j < half; ++j) {
			table[i][j + half] = table[i][j] + half;
		}
	}

	// 填充左下角(对称)
	for (int i = 0; i < half; ++i) {
		for (int j = 0; j < half; ++j) {
			table[i + half][j] = table[i][j + half];
		}
	}

	// 填充右下角(复制左上角)
	for (int i = 0; i < half; ++i) {
		for (int j = 0; j < half; ++j) {
			table[i + half][j + half] = table[i][j];
		}
	}
}

int main() {
	int M;
	cin >> M;
	int N = pow(2, M);
	schedule(N);
	// 输出比赛安排表
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			cout << table[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    标签: 分治
    分享给朋友:

    相关文章

    【题解】泥泞路(2019青岛市程序设计竞赛)

    【题目描述】大雨过后,从小A的农场到镇上的公路上有一些泥泞路段,为了方便出行,他决定将若干块长度为L的木板可以铺在这些泥泞路段上,问他至少需要多少块木板,才能将所有的泥泞路段覆盖住。【输入】第一行为正...

    【题解】求逆序对个数

    【题目描述】有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n<10000),若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,...

    【题解】建设病房

    1.建设病房(build.cpp)【题目描述】2020年1月23日下午,武汉市建设局紧急召集中建三局等单位举行专题会议,要求参照2003年抗击非典期间北京小汤山医院模式,在武汉职工疗养院建设火神山医院...

    【题解】木材加工

    【题目描述】 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有剩余),需要得到的小段的数目是事先给定的,切割时希望得到的小段越长越好。   ...

    【题解】最短距离

    【题目描述】在一条一维的直线上,存在着 n 台显示器和 n 个电源插座。老师给小蓝布置了个任务:负责将每台显示器通过电源线与一个插座相连接(每个插座最多只能给一...

    【题解】舞蹈机器人

    题目描述在一个拥有无限大小的二维平面的原点处,有一个舞蹈机器人,这个机器人将在这个平面上跳舞。这个机器人每次可以向自己的前方移动一个单位的长度,由于它需要在移动的过程中跳舞,因此,舞蹈机器人每移动一次...