Смысл проблем: учитывая п, м, решая лексикографически наименьшее обратное число 1-п, состоящих из т числа столбцов
Метод один: рекурсивное решение насилия
#include <iostream> #include <алгоритм> с помощью пространства имен STD; INT п, м; Int в [( Int ) 5e4 + 5 ]; недействительными ДФС ( INT л, INT г, INT ANS) { если (л == г) { соиЬ << л << ' ' ; вернуться ; } Если (л> = г) возврата ; если (а [г-л + 1 ]> = ANS) { соиЬ << л << ' '; ДФС (с + 1 , г, лет); } Иначе { для ( INT J = L + 1 , J <= г J ++ ) , если (а [JL + 1 ] + а [г-J + 1 ] + JL> = лет) { лет - = (JL ) ; ДФС (л + 1 , J, ans- = мин (лет, [г-J + 1 ])); соиЬ << л << ' ' ; ДФС (J + 1 , г, мин (лет, [г-J + 1 ])); перерыв ; } } } INT основных () { а [ 1 ] = 0 , а [ 2 ] = 0 ; для ( INT I = 3 ; г <= 5e4; я ++ ) а [I] = а [i - 1 ] + i 2 ; CIN >> п >> м; ДФС ( 1 , п, т); вернуться 0 ; }
Более высокая временная сложность; обратная, если максимальное количество цифр, составляющих п-1 больше, чем на 1 м будут непосредственно в первую, рекуррентную последовательность
Если это цифровой номер в обратном порядке, в остальных цифры конфигурации этой позиции не может быть больше, чем число т оборотной стороны перечисления, чтобы найти ближайшее место, чтобы удовлетворить это условие, а затем разделить на две частях рекурсивного
Второй метод:
#include <iostream> использование пространства имен STD; ЬурейеЕ долго долго LL; Int в [( Int ) 1e5 + 5 ]; INT основных () { будет п, м; CIN >> п >> м; LL л = 1 , г = п; для ( INT I = 1 ; г <= п; я ++ ) { INT т = (щ) * (Ni- 1 ) / 2 ; если (т> = м) а [л ++] = I; еще а [г -] = я, м - = (г-л + 1 ); } Для ( INT I = 1 ; г <= п; я ++ ) COUT << а [я] << ' ' ; вернуться 0 ; }
Первое решение вручную моделирования: при сортировке от минимального значения, или разместить заказ или положить в обратном направлении.
Еще одно доказательства: число реверса может составлять меньше, меньше лексикографическое, так и на последнем, сделать минимальное количество лексикографического фронта.