問題の意味:与えられた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に、辞書式フロントの最小数を作ります。