社区讨论
站外题目,但挺有名
学术版参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lwqlkh95
- 此快照首次捕获于
- 2024/05/29 00:13 2 年前
- 此快照最后确认于
- 2024/05/29 14:54 2 年前
循环赛日程表
题目描述
设有 n = 2k 个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能参赛一次;
(3)循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有 n 行和 n-1 列的一个表。在表中的第 i 行,第 j 列处填入第 i 个选手在第 j 天所遇到的选手。其中 1 ≤ i ≤ n,1 ≤ j ≤ n-1。
输入k
输出日程表
思路在此简洁呈现一下


看看各位有没有拓展性更好的代码
本蒟蒻先献上自己的
CPP#include <iostream>
#include <math.h>
using namespace std;
int n;
int getval(int x)
{return int(ceil(log2(x)))-1;}
int _FinD(int ix,int jx,int lx)
{
if(ix==1) return jx;
if(jx==1) return ix;
if(ix==n) return n-jx+1;
if(jx==n) return n-ix+1;
int tl=1<<lx;
if((jx>>lx<<lx==jx?jx>>lx:(jx>>lx)+1)&1)
return _FinD(ix-tl,jx+tl,getval(ix-tl));
return _FinD(ix-tl,jx-tl,getval(ix-tl));
}
int main()
{
scanf("%d",&n);
n=1<<n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",_FinD(i,j,getval(i)));
puts("");
}
return 0;
}
如果各位对我这个方法感兴趣的话,我可以专门再讲讲,简单来说就是倒着推当前位置的数字是由哪个地方的数字复制过来的
回复
共 7 条回复,欢迎继续交流。
正在加载回复...