引言
深切感受到智商的重要性,所以隨後會不定期練習算法題,大約最晚間隔不會超過一週,每次一道,就當大腦訓練,以上。刷的網站也隨機看心情,目前決定用hihoCoder,以下爲這次刷的題。
hiho密碼
描述
小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
分析解答
這道題編程到不困難,難點在於整道題的分析理解上,只要理解了,很容易就寫出來了。重點就在於觀察單詞後面的字母是絕對不可能有逆序的,所以從後往前遍歷,第一個逆序點就是最短的單詞的末尾。有了思路,程序如下(gcc 6,3,1):
#include<stdio.h>
int main(void){
int n;
int i;
int flag=0;
scanf("%d",&n);
int array[n];
for(i=0;i<n;i++)
{
scanf("%d",&array[i]);
}
for(i=n-1;i>0;i--){
if(array[i-1]>array[i]){
flag=i-1;
break;
}
}
for(i=0;i<=flag;i++)
printf("%d ",array[i]);
return 0;
}
~
ps:此處要考慮下臨界值,比如n爲1的情況,我一開始就由於沒有考慮到1導致部分測試用例無法通過