【排隊照相問題】第三次OJ總結
阿新 • • 發佈:2018-12-18
2018/10/22
問題描述
N(N為偶數)個高矮不同的人排成兩排照相,要求每一排都是從矮到高排列,而第二排每個人比第一排對應的人要高,列出所有可能的結果。
輸入格式
第一行正整數N(0<N<100)
第二行第一個人的身高h1
第三行第二個人的身高h2
… 第N+1行第N個人的身高hN
輸出格式
1.每種情況佔據一行; 2.將第一排按照排隊順序輸出身高,然後將第二排按照排隊順序輸出身高; 3.身高之間加空格(第二排最後一人後面為換行符,無空格),兩排之間不加換行符(第一排最後一人與第二排第一人之間為空格)。 4.最後統計所有情況數目並輸出。
輸入樣例
4 161 162 164 163
輸出樣例
161 162 163 164
161 163 162 164
2
或者下列輸出也正確(即不同情況之間可交換順序):
161 163 162 164
161 162 163 164
2
提示
1.使用<stdio.h>中的scanf,printf。它們比<iostream>中的cin, cout更快。
樣例輸入有兩種排隊方式,每種排隊方式輸出的順序如圖中紅線所示:
其中,第一種排隊方式對應輸出如圖所示,第二種同理。
2.每種情況輸出完成後要換行。
3.在輸出時,不同情況的輸出先後順序不影響答案的正確性。
不知道為什麼OJ的題目跟學的內容沒啥關係(大霧)。
我的演算法是這樣的:先把身高順序排列,從中取一個數填到第二排首位(這個數從哪個範圍中取要仔細考慮),再把剩下的數中最小的填到下面(你可以這麼想:如果不取最小的數,那麼必定有一個比它更小的數在右邊某個位置或者某個位置的上方,這是不可能的。)然後就是……遞迴。
不過還是有很多細節,在截止提交後會把程式碼貼上來。