逆の構築

問題の意味:与えられたN、Mの列のm個からなる1-Nの辞書式に最小の逆数を解きます

方法の一つ:暴力再帰的なソリューション

書式#include <iostreamの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
INTのN、M。
INT [(INT)5E4 + 5 ]。
ボイド DFS(int型 L、INT R、INT ANS)
{ 
    場合(L == R){ 
        COUT << L << '  ' 返します
} 
場合(L> = R)を返しますもし([R-L + 1 ]> = ANS)
    { 
        COUT << L << '  '; 
        DFS(S + 1 、R、年)。
    } 
    エルス
    { 
        ためINT J = L + 1 <; = R J ++ J であれば([JL + 1 ] + [R-J + 1 =] + JL> 年)
            {  =(JL - ; 
                DFS(L + 1、J、ans- =分(年、[R-J + 1 ]))。
                coutの <<リットル<< '  ' ; 
                DFS(J + 1、R、分(年、[R-J + 1 ]))。
                破ります; 
            } 
    } 
} 
int型のmain()
{ 
    [ 1 ] = 0、[ 2 ] = 0 以下のためにint型 I = 3 ; iは= 5E4を<; iは++ 
        [i]は = [I- 1 ] + I- 2 
    CIN >> N >> M。
    DFS(1 、n、m)は、
    リターン 0 ; 
}

より高い時間的複雑; N-1を構成する最大桁数が1mであろう直接最初、再帰的配列に比べて大きい場合に逆

これは、この位置の構成の残りの桁に逆の順序でデジタル数である場合、この条件を満足する最も近い場所を見つけるために、列挙の裏面の数mよりも大きく、次いで、再帰二分割することができません

第二の方法:

書式#include <iostreamの> 使用して名前空間はstdを、
typedefの長い長いLL。
INT [(INT)1E5 + 5 ]。
INT )(主
{ 
    LL N、M。
    CIN >> N >> M。
    LL L = 1、R = N。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
    { int型、T =(NI)*(NI- 1)/ 2 もし(T> = M)
            [L ++] = I。
        

 
 
        
            [R - ] = I、M - =(R-L + 1 )。
    } 
    のためにint型 I = 1を iが++; iが<= N 
        COUT << [I] << '  ' リターン 0 ; 
}

最小値から、ソート、または順序を置くためにまたは後方に置くために:マニュアルシミュレーションによる最初のソリューション。

もう一つの証拠:逆の数は、少ない小さな辞書を構成することができ、その最後の1に、辞書式フロントの最小数を作ります。

おすすめ

転載: www.cnblogs.com/zwx7616/p/11402218.html