紫书_第八章_高效算法设计_8.3.2——循环日程表问题
来源:互联网 发布:网络借贷备案信息披露 编辑:程序博客网 时间:2024/06/06 03:06
循环日程表问题
n=2^k个运动员进行网球循环赛,需要设计比赛日程表。每个选手必须与其他n-1选手各赛一次;每个选手一天只能赛一次;循环赛一共进行了n-1天,按此要求设计一张比赛日程表,该表有n行和n-1列,第i行j列为第i个选手第j天遇到的选手。
初看此题,感觉无法下手,因为没有任何直接可用的算法和数据结构
仔细分析,可以发现,将问题进行分解,能找出规律。
当n=1时,共有2个球队参赛,一天就可以比完。
?当 n=2时,共有4个球队,需比赛3天。从2个球队的比赛安排表中可以看出,左上 角与右下角对称,左下角与右上角对称,左下角的值是由左上角值加n得到
发非递归实现:
香
/*************************************************************************> File Name: 循环日程表.cpp> Author:chudongfang > Mail:1149669942@qq.com > Created Time: 2016年06月15日 星期三 21时31分29秒 ************************************************************************/#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define INF (1ll<<60)-1using namespace std;typedef long long ll;int main(int argc,char *argv[]){ int a[1000][1000]; int n,i,j,k,p; scanf("%d",&n); memset(a,0,sizeof(a)); p=1; a[1][1]=1; for(k=2;k<=n;k*=2)//范围由小到大,非递归实现 { for(i=1;i<=k/2;i++) { for(j=1;j<=k/2;j++) { a[i][j+k/2]=a[i][j]+k/2;//右上赋值 a[i+k/2][j]=a[i][j+k/2];//左下赋值 a[i+k/2][j+k/2]=a[i][j];//右下赋值 } } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%4d ",a[i][j]); printf("\n"); } return 0;}递归实现:
/*************************************************************************> File Name: 循环日程表.cpp> Author:chudongfang > Mail:1149669942@qq.com > Created Time: 2016年06月15日 星期三 21时31分29秒 ************************************************************************/#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#define INF (1ll<<60)-1using namespace std;typedef long long ll;int creat_table(int a[][1000],int n);int main(int argc,char *argv[]){ int a[1000][1000]; int n,i,j,k; scanf("%d",&n); memset(a,0,sizeof(a)); /* a[1][1]=1; for(k=2;k<=n;k*=2)//范围由小到大,非递归实现 { for(i=1;i<=k/2;i++) { for(j=1;j<=k/2;j++) { a[i][j+k/2]=a[i][j]+k/2;//右上赋值 a[i+k/2][j]=a[i][j+k/2];//左下赋值 a[i+k/2][j+k/2]=a[i][j];//右下赋值 } } }*/ creat_table(a,n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%4d ",a[i][j]); printf("\n"); } return 0;}int creat_table(int a[][1000],int n){ if(n==1) { a[1][1]=1; return 0; } else { creat_table(a,n/2); for(int i=1;i<=n/2;i++) { for(int j=1;j<=n/2;j++) { a[i][j+n/2]=a[i][j]+n/2;//右上赋值 a[i+n/2][j]=a[i][j+n/2];//左下赋值 a[i+n/2][j+n/2]=a[i][j];//右下赋值 } } }}
0 0
- 紫书_第八章_高效算法设计_8.3.2——循环日程表问题
- 紫书_第八章_高效算法设计_8.3.1——棋盘覆盖问题
- 紫书_第八章_高效算法设计_8.2.1——归并排序
- 紫书_第八章_高效算法设计_8.2.2——快速排序
- 紫书_第八章_高效算法设计_8.2.3——二分查找
- 紫书_第八章_高效算法设计_8.3.3——巨人与鬼
- 高效算法设计_递归与分治(棋盘覆盖问题,循环日程表,巨人与鬼)
- 第八章 高效算法设计
- 高效算法设计_贪心法(最优装载问题,部分背包问题,乘船问题)
- 算法导论_第八章_线性时间排序
- 高效算法设计_算法分析初步(最大连续和)
- 0008算法笔记——【分治法】循环赛事日程表
- 0008算法笔记——【分治法】循环赛事日程表
- 0008算法笔记——【分治法】循环赛事日程表
- 算法笔记——【分治法】循环赛事日程表
- 算法笔记 0008——【分治法】循环赛事日程表
- 0008算法笔记——【分治法】循环赛事日程表
- 基础分治算法题——循环比赛日程表
- JAVA中的static -静态变量-静态方法-静态初始化块
- 计费系统学习之路之错误笔记day07
- Datatable删除行的Delete和Remove方法
- ubuntu/linux下命令行安装jdk
- 148. Sort List
- 紫书_第八章_高效算法设计_8.3.2——循环日程表问题
- HDU2072 单词数(解法二)
- 剑指offer--面试题10-整数的二进制中有多少个1
- C#知识点详解
- 24、DOM的高级应用1-------表格的动态删除和添加行的操作
- 【网络】学习IO 多路复用 select
- RxJava observeOn()与subscribeOn()的关系
- LeetCode:Remove Invalid Parentheses
- 146. LRU Cache