【AtCoder】AGC006 Median Pyramid Easy
阿新 • • 發佈:2018-12-13
文章目錄
題目
題目大意
有一個層的數字金字塔如左圖所示,最下面一層寫了個數(這些數是的一個排列),然後用以下規則填滿這個金字塔: 第行第個數為第行的第、、個數(即它左下、下、右下的數)的中位數。 現在給出金字塔的層數和頂端的數,問能否構造出底層的排列,如果可以,輸出這個排列。
思路
我真的想問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++);
}
}