[python]白駿15787列車が銀河を破った(体現)
10755 ワード
📌 質問する
N本の列車が夜明けに銀河を通り抜ける.
汽車には20列1列の席があり,1席に1人座ることができる.
列車番号が1番からN番になった場合、どの列車に対してもM個の命令があります.
コマンドは4種類あります.
1 i x:iは1列目の列車(1≦i≦N)で、2席目(1≦x≦20)で人を乗せる.すでに人がいれば、何の行動も取らない.
2 ix:i 2番目の列車に乗ってx席に座っている人が降ります.誰もそこに座っていなければ、何の行動も取らない.
3 i:i 2番目の列車に乗っている乗客はみな1両後ろに進んでいる.k番目に座った人はk+1番目に座った.もし20番目の席に座っている人がいたら、その人はこの命令の後で降ります.
4 i:i 2番目の列車に乗っている乗客はみな1両前に進んでいる.k位の人はk-1位に移動して座ります.最初の席に誰かが座っていたら、その人はこの命令の後で降ります.
M号命令後、最初の列車から順番に1本の列車が銀河を通過するのは条件があります.
列車は順番に通過し、列車が通過すると乗客の座り方をカタログに記録し、すでにカタログに存在する記録であれば銀河を通過できない.
例えば、下図では、最初の列車のように、乗客の座り方が記録されていないため、銀河を通り抜けることができます.2列目の列車と同じ状態は記録されていないので、2列目の列車も銀河を通り抜けることができます.3番目の列車は1番目の列車の乗客が乗っている状態と同じで、銀河を渡ることはできません.
始発はだれも乗っていない.
銀河を通り抜ける列車の数を出力してください.
入力
入力された第1行は、列車数N(1≦N≦100000)および命令数M(1≦M≦100000)を与える.その後、2行目からM+1行目まで、各行にコマンドがあります.
しゅつりょく
銀河を通り抜ける列車の数を出力してください.
入力例1
5 5
1 1 1
1 1 2
1 2 2
1 2 3
3 1
サンプル出力1
2
📌 に答える
💬 Code
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
train = [[0 for _ in range(20)] for _ in range(n)]
state = []
for _ in range(m):
a = list(map(int, input().split()))
if a[0] == 1:
train[a[1] - 1][a[2] - 1] = 1
elif a[0] == 2:
train[a[1] - 1][a[2] - 1] = 0
elif a[0] == 3:
for j in range(19, 0, -1):
train[a[1] - 1][j] = train[a[1] - 1][j - 1]
train[a[1] - 1][0] = 0
elif a[0] == 4:
for j in range(19):
train[a[1] - 1][j] = train[a[1] - 1][j + 1]
train[a[1] - 1][19] = 0
cnt = 0
for i in range(n):
if train[i] not in state:
state.append(train[i])
cnt += 1
print(cnt)
💡 Solution
列車ごとに20要素のリストを生成し、20個をすべて0にリセットします(誰も乗っていません)
命令が1であれば、x番目の座席の値のみを1に変更し(元のx番目の座席に人が乗っているかどうかにかかわらず、どうせ座席値は1でなければならないので、着席しているかどうかを判別する必要がある)、命令2、3、4も同様の理由で着席しているかどうかを判別する必要がある
銀河を通る列車の状態を格納するリストstateを作成し、ドアが列車数で回転するとi列車の状態がstateにない場合、state,cnt+=1を挿入します.
Reference
この問題について([python]白駿15787列車が銀河を破った(体現)), 我々は、より多くの情報をここで見つけました https://velog.io/@hygge/Python-백준-15787-기차가-어둠을-헤치고-은하수를-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol