從零開始的算法題生活(一)

引言

深切感受到智商的重要性,所以隨後會不定期練習算法題,大約最晚間隔不會超過一週,每次一道,就當大腦訓練,以上。刷的網站也隨機看心情,目前決定用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導致部分測試用例無法通過
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章