一、問題描述
描述
小Ho根據最近在密碼學課上學習到的知識,開發出了一款hiho密碼,這款密碼的祕鑰是這樣生成的:對於一種有N個字母的語言,選擇一個長度爲M的單詞;將組成這個單詞的所有字母按照順序不重複的寫出(即遇到相同字母時跳過);然後將字母表剩下的沒有使用過的字母按照順序在其後進行排列。
如對於有5個字母的hiho語,選擇單詞1, 2, 2, 4, 3(此處數字表示字母在字母表中的順序),則祕鑰爲1,2,4,3,5。
但是有一天小Ho在計算出了祕鑰之後,卻發現他弄丟了一開始選擇的單詞,於是他找到了你,希望你能夠幫他找到能夠生成這個祕鑰的最短的單詞。
輸入
每個輸入文件包含單組測試數據。
每組測試數據的第一行爲一個正整數N,意義如前文所述。
每組測試數據的第二行爲N個正整數,用來描述一個祕鑰,其中第i個正整數Ai表示祕鑰的第i個字符在字母表中的順序。
對於100%的數據,滿足N<=1000,1<=Ai<=N。
對於100%的數據,滿足對於任意1<=i, j<=N,若i≠j,則Ai≠Aj。
輸出
對於每組測試數據,輸出能夠生成輸入給出的祕鑰的最短的單詞(空串不認爲是單詞)。由於字母表沒有給出,所以對於每個字母,輸出其在字母表中的順序即可(用空格隔開)。
5 1 2 4 3 5樣例輸出
1 2 4注意特判一下全部遞增序的情況
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const int N = 1005;
int a[N];
int main() {
int n,flag;
while(scanf("%d",&n)!=EOF) {
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
flag=0;
for(int i=n; i>1; i--) {
if(a[i]>a[i-1]) {
flag++;
} else
break;
}
if(flag==n-1) {
printf("%d\n",a[1]);
continue;
}
for(int i=1; i<=n-flag-1; i++) {
if(i==1)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
printf("\n");
}
return 0;
}