NKOI 3590 循环赛日程表
问题描述
有n名选手,其中n=2k。设计一个满足以下要求的比赛日程表:
(1) 每个选手必须与其他n-1个选手各赛一次;
(2) 每个选手一天只能赛一次;
(3) 循环赛一共进行n-1天。
按此要求,将比赛日程表设计成一个 n 行n-1列的二维表,其中,第 i 行第 j 列表示和第 i 个选手在第 j 天比赛的选手。
输入格式
一个整数k(1<=k<=8)
输出格式
一个n*n的数字矩阵,表示赛程表,每行数字以空格作为间隔。第一列从上到下分别是1到n,后面n-1列是比赛日程表。比赛日程表的安排方式很多,请找出字典序最小的方案。具体样式参见样例数据。n=2k
样例输入
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
思考
• 为什么题目要让 = 2 呢?
• 肯定是要递归,调用2 −1的函数得到2 时的结果!
• 如何递归?找规律。
解析
• 分治算法:
• 开一个全局变量二维数组a[][]存储答案;
• 递归函数solve(k, x, y)的作用是,生成一个规模为2 × 2 的矩阵,矩阵的左上
角在a[][]数组的第x行第y列。
• 函数实现:
• 若k=0,即生成1×1的矩阵。令a[x][y]=1,返回。
• 若k>0,设 = 2 −1,先递归调用四次:
• solve(k - 1, x, y) solve(k - 1, x, y + m)
• solve(k - 1, x + m, y) solve(k - 1, x + m, y + m)
• 然后将左下、右上区域每个数都+ 。
• 主函数中调用solve(k, 1, 1)。
#include<bits/stdc++.h>
using namespace std;
int a[300][300],k;
void solve(int k,int x,int y,int v) {if(k==0) {a[x][y]=v;} else {int m=1<<k-1;solve(k-1,x,y,v);solve(k-1,x,y+m,v+m);solve(k-1,x+m,y,v+m);solve(k-1,x+m,y+m,v);}
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>k;solve(k,1,1,1);int n=1<<k;for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++)cout<<a[i][j]<<" ";cout<<endl;}return 0;
}//by czy6666666
NKOI 3590 循环赛日程表相关推荐
- python【数据结构与算法】循环赛日程表(分治)
文章目录 1 概述 2 解决 1 概述 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 循环赛一共需要进行n-1天. 由于n=2^k个运动员,显 ...
- 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt
<王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...
- 2.11 循环赛日程表
博主简介:一个爱打游戏的计算机专业学生 博主主页: @夏驰和徐策 所属专栏:算法设计与分析 目录 书本内容: 我的理解: 更优化的算法: 总结 1.注意实现问题 2.当用C语言和C++实现循环赛日程表 ...
- 3.2.4循环赛日程表(递归与分治)
目录 1.问题描述 2.算法分析 算法 3.摘要 参考书籍 1.问题描述 设有个运动员要进行网球循环赛. 现要设计一个满足以下要求的比赛日程表. (1)每个选手必须与其他个选手各比赛一次: (2)每个 ...
- 任意人数的循环赛日程表 分治 非分治 c++
循环赛日程表 要求 设计一个满足以下要求的比赛日程表: 每个选手必须与其他n-1个选手各赛一次: 每个选手一天只能赛一次: 当n是偶数时,循环赛进行n-1天,当n是奇数时,循环赛进行n天: 举例 4位 ...
- 分治法解决循环赛日程表
分治法解决循环赛日程表 问题描述 设有n=2^k个运动员要进行羽毛球循环赛,现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次. (2)每个选手一天只能比赛一次. ( ...
- 循环赛日程表 (递归与分治)
文章目录 1.题目 2.问题分析 3.什么是分治 4.算法实现思路 1.对表进行分析 2.对表的实现 1.递归 2.循环 5算法实现代码 1.递归 2.循环 6.时间\空间复杂度 1.递归 1.空间复 ...
- 分治法-循环赛日程表
问题描述 循环赛日程表:有n = 2^k个运动员要进行网球循环赛 赛程表满足: 每个选手必须与其他n-1个选手各赛一次 每个选手一天只能参赛一次 循环赛在n-1天内结束 解题思路 将比赛日程表设计成一 ...
- 循环赛日程表(非递归)
#include<iostream> #include<vector> #include<iterator> #include<algorithm> u ...
最新文章
- 浅谈 EHT 黑洞照片拍摄原理
- JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表
- 关于GIT的SSH加密问题
- 面试39 MySQL读写分离
- 1057: [ZJOI2007]棋盘制作 - BZOJ
- (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第零节:MYSQL环境安装和表的建立以及一些注意事项
- Eclipse 真机调试检测不到手机解决方案
- 苹果mac好用的记事本软件:Ulysses 24
- Revit软件安装族库/族样板/项目样板默认位置在哪?(详细说明)
- cuda+cudnn下载安装
- 恒生UFX 统一接入介绍
- Drools——什么是规则
- Spring Aop(入门篇)
- 智力题:1000瓶酒.10只老鼠.有一瓶酒有毒,每只老鼠可以喝无限多的酒,如何测一次就找出哪瓶酒有毒
- POI读取Excel(兼容Excel2003、Excel2007)
- compiz在debian上的安装和使用
- puzzle(0151)《24点》
- word批量导入试题,一键组卷,单机软件题库管家迎来1.2版本
- 什么是孤独?。。。一款只有6个用户的APP
- 2017 ACM Arabella Collegiate Programming Contest G. Snake Rana GYM101350G