Corporal Klinger在韓戰期間服役於韓國第4077野戰醫院。他想盡辦法要離開那個鬼地方。正好美國陸軍下了一道命令要以樂透的方式讓一些幸運的傢伙(共有X個人)可以回美國休假。Klinger需要你的幫忙以離開那裡。
樂透的方式是這樣的:準備一副撲克牌,叫所有參加的人排成一列,然後翻開撲克牌中的第一張,假設該張撲克牌的點數是K,首先從第一個人算起,到第K 個人那個人就被淘汰出列,然後下一個人又從1算起,第K個人又被淘汰出列,如此下去直到算到最後一人為止。當算完最後一人時(不管算到多少),翻開下一張 撲克牌,然後依照上面的點數又從第一個人從1開始算,並且仿照前面的方式淘汰人。如此一直持續下去。當然,在淘汰的過程中,如果剩下的人數為X人,遊戲就 結束了,這X人就是可以回美國休假的幸運者。
Klinger有辦法在撲克牌上面動手腳,所以他可以事先知道撲克牌的點數,但是在樂透開始之前一分鐘他都無法知道到底會有多少人會參加樂透。你的任務就是幫他寫一個程式,在最後一分鐘知道有多少人參加後,馬上為他算出他該站在哪一個位置,確保他可以回美國休假。
在此提供一個簡單的例子,若有10個人參加樂透,且只能有2幸運的傢伙,而撲克牌出現的點數依次是3,5,4,3,2的話,那麼Klinger應該要排在第1或第8個位置。
每組測試資料1列,每列固定有22個整數,第一個整數N(1 <= N <= 50)代表有多少人參加樂透。第二個整數X(1 <= X <= N)代表有多少個幸運的傢伙可以回美國休假。接下來的20個整數依次為Klinger所提供的撲克牌出現的點數,這些點數為1到11的整數。
每組測試資料請輸出這是第幾組測試資料以及Klinger可以站的位置(由小到大排)。如果在20張撲克牌內,遊戲沒有結束,請將隊伍中還剩下的人印出。每組測試資料後空一列,請參考Sample Output。
10 2 3 5 4 3 2 9 6 10 10 6 2 6 7 3 4 7 4 5 3 2 47 6 11 2 7 3 4 8 5 10 7 8 3 7 4 2 3 9 10 2 5 3
Selection #1 1 8 Selection #2 1 3 16 23 31 47
這題我知道要模擬,但卻搞到複雜.......最後看人家的技巧
python
n_game = 0 while True: try: nums=[int(x) for x in input().split()] n = nums.pop(0)#參加人數 x = nums.pop(0)#最後剩下人數 people = [i for i in range(n)] #[0,1,2,3,4,5,6,7,8,9] while(nums):#這裡一定要讓他整個迴圈跑完 k=nums.pop(0)#這個寫法就可以代表一個for迴圈了 """ 這裡有一個小技巧; 我今天要從1開始刪掉3的倍數,就是位置3 6 9,也就是位置2 5 8(因為索引值從0開始), 但明明差距是3,我卻只要用差距2的方式就好 範例: 1[0] 2[1] _3[2]_ 4[3] 5[4] 6[5] 7[6] 8[7] 9[8] 10[9] (這裡是表示索引值) 我先把索引值(3-1)刪掉(剛好是數值3) 1[0] 2[1] 4[2] 5[3] _6[4]_ 7[5] 8[6] 9[7] 10[8] (這裡是表示索引值) 接下來我要刪數值6,但因為剛剛索引值毀往前推的關係,數值6的索引值就會變成4(也就是我剛剛索引值2之後在加2) 1[0] 2[1] 4[2] 5[3] 7[4] 8[5] _9[6]_ 10[7] (這裡是表示索引值) 我要刪數值9,他剛好會在索引值6(也就是索引值2+2+2) """ id=0 while(len(people)>x and id+k<=len(people)): id+=k-1 people.pop(id) people=[str(i+1) for i in people] n_game+=1 print(f"Selection #{n_game}") print(" ".join(people)) except: break