可以看出最坏安排需要$2N-3$次操作。
以A为例,若A不在首位,那么需要先在A处切割,旋转一次将其放到队列尾,再旋转一次将其放到队首。
前N-2个车厢都需要如此操作,共$2N-4$次,最后两节车厢只需旋转一次,因此总共$2N-3$次。
由于$11!$是千万级不算太大,因此直接枚举所有排列计算即可得结果$CAGBIHEFJDK$。
注:以下代码为Python 3,因Python 3的字符串处理效率更优,代码中还打印了进度信息。
import itertools
symbols="ABCDEFGHIJK"
target=2011
for c in itertools.permutations(symbols,len(symbols)):
s=list(c)
i=0
while i < len(symbols)-1:
if s[0]==symbols[i] or (len(s)>2 and s[-1]==symbols[i]):
break
else:
k=s.index(symbols[i])
s=s[:k]+s[:k-1:-1]
s.pop()
s.reverse()
i+=1
if i==len(symbols)-1:
target-=1
if target==0:
print("".join(c))
break
elif target%100==0:
print(target,"left to be found")
|