1. 程式人生 > >【排隊照相問題】第三次OJ總結

【排隊照相問題】第三次OJ總結

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的題目跟學的內容沒啥關係(大霧)。

我的演算法是這樣的:先把身高順序排列,從中取一個數填到第二排首位(這個數從哪個範圍中取要仔細考慮),再把剩下的數中最小的填到下面(你可以這麼想:如果不取最小的數,那麼必定有一個比它更小的數在右邊某個位置或者某個位置的上方,這是不可能的。)然後就是……遞迴。

不過還是有很多細節,在截止提交後會把程式碼貼上來。