masuTomo’s blog

競技プログラミングの勉強メモです.主にPythonを使用します.数学の記事も書くかもしれません.

yukicoder No.893 お客様を誘導せよ

この問題は別に書かなくてもいいかなと思ったけど,みんなそう思ったのか解説記事が少なそうなので一応書くことにした。

問題

No.893 お客様を誘導せよ - yukicoder

やり方はすぐわかると思われる。 f:id:masuTomo:20200103003557p:plain

上図のようにレジ(塗りつぶしがレジ,白の四角が人)に人が並んでいるとすると出力すべき答えは  32745861である。
実装のポイントは以下の2点。

  • 入力の受け取り

  • レジに並んでいる人数の把握 入力の受け取りはこうした

N = int(input())
P = [0 for _ in range(N)]
A = [[] for _ in range(N)]
for i in range(N):
    P[i],*A[i] = map(int,input().split())

これでP,Aは以下のようになる

#入力
#3
#3 1 2 3
#2 4 5
#1 6

#出力
#P:[3, 0, 1, 2, 0]
#A:[[1, 2, 3], [], [4], [5, 6], []]

あとはAに格納されている要素を前から順に出力する。このときにindexを指定してもよいがpopを利用すると楽である。

5. データ構造 — Python 3.8.1 ドキュメント

ざっくりいうと,指定したindexの要素を取り出して,削除する。
list.pop(0)とすれば先頭の要素を取り出して,その要素を削除するので,pop(0)を繰り返せば常に先頭の要素が取り出せる。
さらにそのときに,P[i]の値を1ずつデクリメントしておけば,out of indexのエラーがでることも防げる。

N = int(input())
P = [0 for _ in range(N)]
A = [[] for _ in range(N)]
cnt = 0
for i in range(N):
    P[i],*A[i] = map(int,input().split())
    cnt += P[i]
i,j = 0,0
while 1:
    if P[i%N] > 0:
        print(A[i%N].pop(0), end=" ")
        j += 1
        P[i%N] -=1
        if j == cnt:
            exit()
    i += 1