[BOJ/Python]200055号コンベアのロボット



この問題はdequeで解決した.まず、条件に従ってdequeのrotate()関数を使用してベルトとロボットを1つずつ動かし、n-1インデックスにあるロボットを取り除きます.その後、後ろからロボットリストを巡回し、次の格子にロボットがなく、次の格子の耐久度が0より大きい場合、1つの格子を移動します.この場合、ロボットがn-1インデックスに存在する可能性もあるので、n-1ビットのロボットは削除されます.また、アップロード位置にロボットがなく、アップロード位置の耐久度も0より大きい場合は、ロボットを1つアップロードします.
  • n,kと入力します.
  • コンベアの耐久性を格納するリストバンドをDequeとする.
  • ロボットの位置を保存するリストロボットをDequeと宣言します.
  • の正解を保存する変数の答えを0にします.
  • ドアを回すと
  • になります.
    ->ベルトを1方向に回します.
    ->ロボットを一方向に回転させます.
    ->robot[-1]が0に更新されました.
    ->n-2から0まで減少したiのfor文.
    -->robot[i]が1の場合、
    -->robot[i+1]が0で、belt[i+1]が0より大きい場合、
    ------>robot[i]robot[i+1]は0と1に更新されます.(移動自動機)
    ------>belt[i]マイナス1.(ロボット移動後の耐久性低下)
    ->robot[-1]が0に更新されました.
    ->belt[0]が0より大きい場合、robot[0]が0に等しい場合、
    -->robot[0]が1に更新されました.
    -->belt[0]から1を減らします.
    ->答えを1つ増やします.
    ->beltの0の個数がkより大きい場合、
    -->while文を閉じます.
  • の回答を印刷します.
  • Code

    from collections import deque
    n, k=map(int, input().split())
    belt=deque(list(map(int, input().split())))
    robot=deque([0]*n)
    answer=0
    while True:
        belt.rotate(1)
        robot.rotate(1)
        robot[-1]=0
        for i in range(n-2, -1, -1):
            if robot[i]==1:
                if robot[i+1]==0 and belt[i+1]>0:
                    robot[i], robot[i+1]=0, 1
                    belt[i+1]-=1
        robot[-1]=0
        if belt[0]>0 and robot[0]==0:
            robot[0]=1
            belt[0]-=1
        answer+=1
        if belt.count(0)>=k:
            break
    print(answer)