[C_MM218-中] 重排第幾個
成績: 0 / 倒扣: 0.8
問題描述 :
1到N有N個正整數,這N個正整數排成一列共有N!排法,這N!個重排依字典排序法從小到大排列編號。第一號為「1 2 3 … N」,第N!號為「N N-1 N-2 … 1」。以下為N=3時的狀況。
現在輸入一個重排,試求該重排是在該長度重排中的第幾個。
輸入說明 :
輸入一個1到N的重排,0 < N < 25。
輸出說明 :
輸出該重排是N!個重排中的第幾個。
範例 :
1到N有N個正整數,這N個正整數排成一列共有N!排法,這N!個重排依字典排序法從小到大排列編號。第一號為「1 2 3 … N」,第N!號為「N N-1 N-2 … 1」。以下為N=3時的狀況。
順序 | 重排 |
1 | 1 2 3 |
2 | 1 3 2 |
3 | 2 1 3 |
4 | 2 3 1 |
5 | 3 1 2 |
6 | 3 2 1 |
輸入說明 :
輸入一個1到N的重排,0 < N < 25。
輸出說明 :
輸出該重排是N!個重排中的第幾個。
範例 :
輸入範例 | 輸出範例 |
2 1 3 | 3 |
while True:
try:
N = list(map(int,input().split()))
for i in range(len(N)):
N[i] = N[i] - 1
def rot(data, n): # 將第n個搬到最後
val = data.pop(n)
data.append(val)
return data
def rot_n_chk(data, n): # 檢查第n個要不要搬
for i in range(n-1):
if data[i] == i:
rot(data, i+1)
else:
break
return data
def chk_stop(data, n): # 檢查所有的位置是否都歸位
res = 1
for i in range(n): # 只要第i位置對 chk=1, 位置不對 chk=0
chk=1 if data[i] == i else 0
res *= chk # 每位的乘積
return res # res乘積為1表示全歸位都輪完了
#data = [i for i in range(1, N+1)] #[1, 2, 3...]
data_i = [i for i in range(len(N))] #[0, 1, 2...]
data_p = []
while True:
rot(data_i, 0)
rot_n_chk(data_i, len(N))
#print(num, odata)
b = data_i[:]
data_p.append(b)
if chk_stop(data_i, len(N)):break
r = sorted(data_p)
#print(r[K-1])
print(r)
print(r.index(N)+1)
except(EOFError):
break
沒有留言:
張貼留言