2020年4月5日 星期日

[C_MM212-易] 路上的東西不要亂撿 !

[C_MM212-易] 路上的東西不要亂撿 !

成績: 0 / 倒扣: 0.8
題目說明: 有一天你在路上撿到一台機器,由於樣子非常奇特所以你決定帶回家好好的研究一番,不料當機器啟動的瞬間突然產生一道強烈的光芒,瞬間你失去了視覺。當你恢復視力時,發現你身處在一個奇怪的王國,並且被一堆拿著武器的人包圍著,隨後就被帶去類似監獄的地方。在那裏你發現也有很多被抓來的囚犯,一問之下發現大家都是啟動那台機器後就突然跑到這裡了,並且你被告知一個驚人的事實!就是這裡的人都將接受處決,而只有一位幸運兒才能活著離開;處決方式是這樣的:將 m 個 囚犯們賦予一個編號 (1~m) 並依順時針圍成一圈,從編號 1 的囚犯依順時鐘由 1 開始報數,報到 k 的這個數字即被立刻殺掉,然後再由下一個編號的囚犯再開始順時鐘依次報數,報到 的人再被殺掉,直到最後一個活著的人就可以活著離開。例如 m = 9 , k = 7 處決過程如下:
1 2 3 4 5 6 7 8 9 => 殺掉 7 號囚犯
1 2 3 4 5 6 8 9 => 殺掉 5 號囚犯
1 2 3 4 6 8 9 => 殺掉 4 號囚犯
1 2 3 6 8 9 => 殺掉 6 號囚犯
1 2 3 8 9 => 殺掉 9 號囚犯
1 2 3 8 => 殺掉 3 號囚犯
1 2 8 => 殺掉 8 號囚犯
1 2 => 殺掉 1 號囚犯
2 號囚犯於是可以活著離開。現在你還不想這麼早上天堂,因此想藉由寫一個程式來替自己解圍,算出在 m 個囚犯之中,自己應該排在第幾號才可以活著離開。
輸入說明: 第一列為一個 N <= 15 正整數 ,代表接下來有 N 組測試資料,每組測試資料均有兩個正整數 m, k ( 1 <= m <= 100000 , 1 <= k <= 999999) ,分別代表 個囚犯以及報數值 k,中間以一個空格隔開。
輸出說明: 輸出自己應該排在編號幾的位置才能夠存活。每筆輸出佔一列。
範例 
Sample Input:Sample Output:
3
9 7
10 2
3 5

2
5
  
while True:
    try:
        N = int(input())
        for i in range(N):
            m, k = map(int,input().split())
            p = [i for i in range(1, m+1)]
            index = 0 #爆掉的索引值
            while len(p)!=1: #剩下1個時停止
                index = (index +(k - 1))%len(p)
                del p[index]
            print(p[0])
    except(EOFError):
        break

沒有留言:

張貼留言