AtCoder

ABC376 B問題(Hands on Ring (Easy))を解く

AtCoder_ABC376_B

AtCoder が提供しているABC(AtCoder Beginner Contest)376 B問題をC++とPythonで解いてみました。ABC376は、2024年10月19日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 Hands on Ring (Easy)(Difficulty : 290)

問題の詳細は、リンク先をご覧ください。

ABC376 B問題 Hands on Ring (Easy)

条件分岐を丁寧に実装していきます。AtCoder Problems による Difficulty は 290 でした。

解答案

C++ プログラム例(ABC376B)

以下の8通りに場合分けして処理します。

  • $L$ を動かす場合
    • $L < T$ の場合
      • $L < R < T$ の場合、動く量は、$L+N-T$ となります。
      • 上記ではない場合、動く量は、$T-L$ となります。
    • $T < L$ の場合
      • $T < R < L$ の場合、動く量は、$T+N-L$ となります。
      • 上記ではない場合、動く量は、$L-T$ となります。
  • $R$ を動かす場合
    • $R < T$ の場合
      • $R < L < T$ の場合、動く量は、$R+N-T$ となります。
      • 上記ではない場合、動く量は、$T-R$ となります。
    • $T < R$ の場合
      • $T < L < R$ の場合、動く量は、$T+N-R$ となります。
      • 上記ではない場合、動く量は、$R-T$ となります。

上記の分岐を実装したのが、以下のC++プログラムとなります。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n, q;
	cin >> n >> q;

	int L = 1;
	int R = 2;
	int result = 0;
	for (int i = 0; i < q; ++i) {
		char h;
		int t;
		cin >> h >> t;

		if (h == 'L') {
			if (L < t) {
				if ((L < R) && (R < t)) {
					result += L + n - t;
				} else {
					result += t - L;
				}
			} else {
				if ((t < R) && (R < L)) {
					result += t + n - L;
				} else {
					result += L - t;
				}
			}
			L = t;
		} else {
			if (R < t) {
				if ((R < L) && (L < t)) {
					result += R + n - t;
				} else {
					result += t - R;
				}
			} else {
				if ((t < L) && (L < R)) {
					result += t + n - R;
				} else {
					result += R - t;
				}
			}
			R = t;
		}
	}

	cout << result << endl;

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC376B)

Python版も基本的な考え方は同じです。以下がプログラムです。

"""AtCoder Beginner Contest 376 B"""
n, q = map(int, input().split())

L = 1
R = 2
result = 0
for i in range(q):
    h, t = input().split()
    t = int(t)

    if h == 'L':
        if L < t:
            if L < R < t:
                result += L + n - t
            else:
                result += t - L
        else:
            if t < R < L:
                result += t + n - L
            else:
                result += L - t
        L = t
    else:
        if R < t:
            if R < L < t:
                result += R + n - t
            else:
                result += t - R
        else:
            if t < L < R:
                result += t + n - R
            else:
                result += R - t
        R = t

print(result)

こちらも「AC」と判定されました。

最後に

この問題は、実装が面倒に感じて後回しにしました。このような問題を素早く解くこともレート向上には必要かもしれません。

引き続き ABC の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA