yyyfff123
@yyyfff123

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Atcoder ABC376のB問題でコードの誤りが見つけられない

解決したいこと

Atcoderでアルゴリズムを学習しています。

初めてコンテストに参加したのですが、ABC376のB問題が不正解でした。

サンプルは全て通ったのですがその他テストケースでWAになってしまいました。

解説を読み、自身が考えていたことは概ね合っていたと思うのですが、
コードの誤りが見つけられません。

どのようなテストケースでエラーになるのか、
またはコード上どんなケースが考慮されていないのか、ご教授頂けないでしょうか。

ABC376 B問題
https://atcoder.jp/contests/abc376/tasks/abc376_b

提出
https://atcoder.jp/contests/abc376/submissions/58980865

該当するソースコード

N, Q = map(int, input().split())

ring = ["0"]*N
ring[0] = "L"
ring[1] = "R"

sum = 0
for i in range(Q):
  H, T = input().split()
  T = int(T)
  #Rの居場所
  R_index = ring.index("R")
  #Lの居場所
  L_index = ring.index("L")

  if H == "R":
    new_index = T - 1
    tmp = R_index
    #右移動でLが先にいる場合
    if R_index < L_index and new_index > L_index:
      #左移動
      while new_index != tmp:
        if tmp == 0:
          tmp = len(ring) - 1
        else:
          tmp -= 1
        sum += 1
    else:
      #右移動
      while new_index != tmp:
        if tmp == len(ring) - 1:
          tmp = 0
        else:
          tmp += 1
        sum += 1
    ring[R_index] = "0"
    ring[new_index] = "R"
  elif H == "L":
    new_index = T - 1
    tmp = L_index
    #右移動でRが先にいる場合
    if L_index < R_index and new_index > R_index:
      #左移動
      while new_index != tmp:
        if tmp == 0:
          tmp = len(ring) - 1
        else:
          tmp -= 1
        sum += 1
    else:
      #右移動
      while new_index != tmp:
        if tmp == len(ring) - 1:
          tmp = 0
        else:
          tmp += 1
        sum += 1
    ring[L_index] = "0"
    ring[new_index] = "L"

print(sum)
0

1Answer

エラーになるテストケースを挙げておくので、デバッグしてみてください。

入力例1

3 2
R 3
R 2

出力例1

2

入力例2

3 3
R 3
L 2
L 1

出力例2

3

入力例3

3 3
L 3
R 1
L 2

出力例3

3
1Like

Comments

  1. @yyyfff123

    Questioner

    ありがとうございます。
    正しい答えを得られなかったので、コードの誤りを探してみます。

  2. @yyyfff123

    Questioner

    頂いたテストケースでデバッグしました。
    右移動させるべきか、左移動させるべきかの条件がおかしいのは理解しましたが、
    修正案が思いつきませんでした。。。
    私が書いたコードは大幅に書き換えないと修正できないでしょうか。
    それとも少しの修正で正常動作するようになるでしょうか。
    よろしければご教授お願い致します。

  3. #右移動でLが先にいる場合の直後の判定と#右移動でRが先にいる場合の直後の判定を修正すれば正常動作します。ありえるすべてのパターンを愚直に判定する形にはなりますが。
    ご自身で書かれている通り、考慮されていないケースがあるから正常動作していないので、そのケースを判定する条件を追加すればよいです。例えば、私の出した最初の例だと、L_index = 0new_index = 1R_index = 2Rを右に移動しているのが誤答の原因なので、このようなケースを判定する条件を#右移動でLが先にいる場合に追加すればよいです。
    どうしても分からなければ、こちらに修正したソースを載せておくので、参照してください。

Your answer might help someone💌