BOJ 1158ジョセフス問題


https://www.acmicpc.net/problem/9471
2秒、128 MBメモリ
input :
  • N K(1 ≤ K ≤ N ≤ 5,000)
  • output :
    出力
  • ジョセフスシーケンス
  • どうやって試合を表現すればいいか分からないが...ふさがれる
    どのように物を削除するかで妨げられています.
    道具のremove、delを削除したことしか覚えていません.
    pop()を使う人がいて、この機会に使ってみました.
    pop()は、削除されたアイテムを返すため、この場合に役立ちます.
    インデックスが0の場合、削除する必要があるインデックスは2です.
    2の時は4
    4日の時は6...
    リストの長さがインデックスを超えた場合、どうすればいいですか?これは問題です.
    残りの演算で簡単に得られます.
    [1,2,4,5,7]を持つリストが現在存在する場合.
    idxが3にある場合、次の削除が必要なidxは5ですが、存在せず、idx 0をループで指し示す必要があります.ここから見れば.
    idx%len(data)で入手できます.
    import sys
    
    n, k = map(int, sys.stdin.readline().split())
    data = [i for i in range(1, n + 1)]
    
    res = []
    idx = k - 1
    for i in range(n):
        if idx >= len(data):
            idx %= len(data)
            res.append(data.pop(idx))
            idx += k - 1
        else:
            res.append(data.pop(idx))
            idx += k - 1
    print("<", end="")
    for idx, item in enumerate(res):
        if idx == len(res) - 1:
            print(item, end="")
        else:
            print("{}, ".format(item), end="")
    print(">")