Se resolvió un problema complementario del grupo de promoción NOIP en años anteriores.
Debido a que la salida está ordenada, este problema equivale a tomar los ordenados 1, 2, 3,..., n, que se puede resolver mediante algunos algoritmos combinados. No entiendo su resultado (parece estar organizado, no en orden). Solo escribí la versión Python del algoritmo de generación de combinaciones. La esencia es usar la característica de seleccionar m de n para usar la estructura [0, 1, 1, 0] para expresar qué m números se seleccionan. el primer 1, 0, intercambia las posiciones de 1 y 0 para obtener la siguiente permutación. Publiqué la versión Python del código a continuación:
El enfoque utilizado en su pregunta es la combinación ([1, 2, 3, ..., n], m).
Definir combinación (lst, k):
es _ in =[1]* k [0]*(len(lst)-k)
top_begin, top_end = 0, len(lst)-k
L = len(lst)
mientras top_begin! = top_end:
_combination = tuple([x para x, y en zip(lst, is_in) if y == 1])
yield_combination
Para I en el rango (L-1, 0, -1):
Si is_in[i-1] == 1 y is_in[i] == 0:
leftOnes = sum(is_in[i :])
is _ in = is _ in[:I-1] [0] [1]*(los izquierdos 1) [0]*(L-I-los izquierdos- 1)
top _ comenzar = int(está _ en[top _ comenzar]!= 1)
Romper
tupla de rendimiento (lst[- k: ])