版权声明:本文为博主原创文章,不管你喜不喜欢都请在注明作者后转载~( ̄▽ ̄~) https://blog.csdn.net/C20190102/article/details/82932347
题目
题目大意
有一个
层的数字金字塔如左图所示,最下面一层写了
个数(这些数是
的一个排列),然后用以下规则填满这个金字塔:
第
行第
个数为第
行的第
、
、
个数(即它左下、下、右下的数)的中位数。
现在给出金字塔的层数
和顶端的数
,问能否构造出底层的排列,如果可以,输出这个排列。
思路
我真的想问AtCoder出题人的脑洞有多大= =
这道题的解法越想越奇妙= =
首先,当
或
时无解(可以理解),其他情况均有解(见下面)。
你发现,只要在倒数第二行中部出现了一对
基因?,那么顶端一定是
,如图所示:
因为
的中位数一定是
。
于是做完了,你随便构造一下使倒数第二行中部有两个
即可。
例如:
(当
的时候特殊处理一下)。
代码
极丑。
#include<cstdio>
int N,X;
int main(){
scanf("%d%d",&N,&X);
if(X==1||X==2*N-1)
return !puts("No");
puts("Yes");
if(N==2)
return !puts("1\n2\n3");
if(X==2){
for(int i=1;i<=N-2;i++)
printf("%d\n",4+i);
printf("3\n2\n1\n4\n");
for(int i=1;i<=N-3;i++)
printf("%d\n",N+2+i);
return 0;
}
int cnt=1;
for(int i=1;i<=N-2;i++){
if(cnt==X-2)
cnt=X+2;
printf("%d\n",cnt++);
}
printf("%d\n%d\n%d\n%d\n",X-1,X,X+1,X-2);
for(int i=1;i<=N-3;i++){
if(cnt==X-2)
cnt=X+2;
printf("%d\n",cnt++);
}
}