对比赛项目编号归纳。第 1 项的“落败者”是该项目的最后一名,显然必被淘汰。假设前 m-1 项的“落败者”都会被淘汰,考虑第 m 项的“落败者”。假设存在一种场次安排使得他在项目 m 比赛后不淘汰,设有 x 名实力比他更弱的选手能够参加项目 m 的比赛。由“落败者”的定义,这些人分别是前 m-1 项之一的“落败者”,由归纳假设以及他们能够参加项目 m 的比赛知他们的“落败项”均尚未比赛,故这一场比赛至少是倒数第 x+1 场,淘汰的人数至少为 2^x 人。而 x \ge 0 时 2^x \ge x+1,所以作为当前第 m 项的倒数第 x+1 名他理应被淘汰,矛盾。故我们的断言成立。
#include<cstdio>
#define rg register
int n,m,l,tg[16],c;
int main()
{
scanf(" %d",&n),l=1<<n,m=l-n,printf("%d\n",m);
for(rg int v=l>>1;v;v>>=1)for(rg int i=l-1;~i;--i)printf("%d%c",(i^v)+1,i?' ':'\n');
for(rg int i=0,t=1,b=0;i<l;++i)
{
if(i==t){t<<=1,++b;continue;}printf("%d ",i+1),tg[c=0]=-1;
for(rg int v=1,j=0;v<t;v<<=1,++j)if(i&v)tg[++c]=j;tg[0]=tg[c];
for(rg int j=n-1;~j;--j)printf("%d%c",n-((j==tg[c])?(tg[--c]):j),j?' ':'\n');
}
return 0;
}
以下给出构造方法得出的思路。考虑归纳。n=1 时构造显然。设 n \le k 时已经构造完毕。考虑 n=k+1 时。
首先假设第一项比赛淘汰的 2^k 名选手组成的集合为 B,剩下 2^k 名选手组成的集合为 A,对 A 用归纳假设知其中有 2^k-k 人能夺冠。因此我们在 B 中希望有 2^k-1 人能夺冠,因此我们需要有更强的条件。为了得到这个条件,我们不妨设剩下的项目中均是 B 中选手排名前 2^k。这样我们发现第一场比赛剩下的任一项目都可以使得 A 全员淘汰,对 B 中选手是没有影响的,可以看作一个“废项”。对条件进行加强,往证一个引理: