解决了NOIP推广组前几年的一个补充问题

因为输出是有序的,所以这个问题等价于取排列好的1,2,3,...,n,可以通过一些组合算法来求解。你的输出我没看懂(好像是安排好的,不是按顺序)。我只写了python版的组合生成算法,本质是利用n中取m的特性用[0,1,1,0的结构]表示选择了哪m个数,算法是反求第一个1,0,交换1和0的位置得到下一个排列。我在下面贴了python版本的代码-

使用你的问题的方法是组合([1,2,3,...,n],m)。

定义组合(lst,k):

is _ in =[1]* k+[0]*(len(lst)-k)

top_begin,top_end = 0,len(lst)-k

L = len(lst)

while top_begin!= top_end:

_combination = tuple([x for x,y in zip(lst,is_in) if y == 1])

产量_组合

对于范围内的I(L-1,0,-1):

如果is_in[i-1] == 1且is_in[i] == 0:

leftOnes = sum(is_in[i :])

is _ in = is _ in[:I-1]+[0]+[1]*(left ones+1)+[0]*(L-I-left ones-1)

top _ begin+= int(is _ in[top _ begin]!= 1)

破裂

yield tuple(lst[-k :])