AtCoder

ABC313 A問題(To Be Saikyo)を解く

AtCoder_ABC313_A

AtCoder が提供しているABC(AtCoder Beginner Contest)313 のA問題をC++とPythonで解いてみました。ABC313は、2023年8月5日21:00に実施されました。

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

A問題 To Be Saikyo(Difficulty : 40)

問題はリンク先をご覧ください。

ABC313 A問題 To Be Saikyo

与えられた数列の最大値を求めます。少し注意が必要です。AtCoder Problems による Difficulty は 40 でした。

解答案

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

与えられた数列の最大値を求めて1を加えて P0 との差を求めればよいような気がします(P の添え字は0からとしています)。以下の注意が必要です。

  • 自分自身が単独で最大となる場合は、0 が解となる(入力例2)。
  • 自分自身が最大でも、他に同じ大きさの要素があれば、1 が解となる(入力例3)。

A問題ということに配慮したのか、入力例で注意点に気付くよう誘導されていました。以下の手順をコードにします。

  • p[1] 以降の要素の最大値 maxp を求める(11、13行目)。
  • p[0] と maxp を比較して、
    • p[0] の方が大きければ 0 を出力する。
    • それ以外の場合 maxp + 1 – p[0] の値を出力する。

以下が、C++プログラムとなります。

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

int main()
{
	int n;
	cin >> n;
	vector<int> p(n);
	cin >> p[0];
	int maxp = 0;
	for (int i = 1; i < n; ++i) {
		cin >> p[i];
		maxp = max(maxp, p[i]);
	}

	if (p[0] > maxp) {
		cout << 0 << endl;
	} else {
		cout << maxp + 1 - p[0] << endl;
	}

	return 0;
}

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

Python プログラム例(ABC313A)

スライス記法と組込み関数 max を使うと maxp = max(p[1:]) と書くことができます。ただし、リストの大きさ n が 1 の時に Runtime Error が発生します。そのため、n が 1 の時は、maxp は、p[0] – 1 とします(5行目)。

"""AtCoder Beginner Contest 313 A"""
n = int(input())
p = list(map(int, input().split()))

maxp = max(p[1:]) if n > 1 else p[0] - 1
print(0 if p[0] > maxp else maxp + 1 - p[0])

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

最後に

A問題としては、少し難しかったかもしれません。コンテスト本番で使っている C++ では一発でACを得ましたが、コンテスト後に解いた Python では、1回 RE 判定を受けました。

このABC313は、AtCoder が主催する学生向けのコンテストの予選になっていました。このためか、通常のABCと比較して難易度が高いと感じました。

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

COMMENT

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

CAPTCHA