站外题目,但挺有名
  • 板块学术版
  • 楼主RsveNotiLess
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/5/29 00:12
  • 上次更新2024/5/29 14:54:48
查看原帖
站外题目,但挺有名
381283
RsveNotiLess楼主2024/5/29 00:12

循环赛日程表

题目描述

设有 n = 2k 个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表

(1)每个选手必须与其他n-1个选手各赛一次;

(2)每个选手一天只能参赛一次;

(3)循环赛在n-1天内结束。

请按此要求将比赛日程表设计成有 n 行和 n-1 列的一个表。在表中的第 i 行,第 j 列处填入第 i 个选手在第 j 天所遇到的选手。其中 1 ≤ i ≤ n,1 ≤ j ≤ n-1。

输入k 输出日程表

思路在此简洁呈现一下

看看各位有没有拓展性更好的代码

本蒟蒻先献上自己的

#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;
}

如果各位对我这个方法感兴趣的话,我可以专门再讲讲,简单来说就是倒着推当前位置的数字是由哪个地方的数字复制过来的

2024/5/29 00:12
加载中...