2020年4月10日 星期五

[C_MM218-中] 重排第幾個

[C_MM218-中] 重排第幾個

成績: 0 / 倒扣: 0.8
問題描述 :
1到NN個正整數,這N個正整數排成一列共有N!排法,這N!個重排依字典排序法從小到大排列編號。第一號為「1 2 3 … N」,第N!號為「N N-1 N-2 … 1」。以下為N=3時的狀況。
順序重排
11 2 3
21 3 2
32 1 3
42 3 1
53 1 2
63 2 1
現在輸入一個重排,試求該重排是在該長度重排中的第幾個。
輸入說明 :
輸入一個1到N的重排,0 < N < 25。
輸出說明 :
輸出該重排是N!個重排中的第幾個。
範例 :

輸入範例輸出範例
2 1 33


    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

沒有留言:

張貼留言