解决了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 :])