AtCoder

ABC290 A問題(Contest Result)を解く

AtCoder_ABC290_A

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

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

A問題 Contest Result(Difficulty : 9)

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

ABC290 A問題 Contest Result

指定された配列要素の合計を求めます。AtCoder Problems による Difficulty は 9 でした。

解答案

問題を以下の方針で解きます。

  • N と M、配列 A と配列 B を読み込む。
  • 配列 B に対して、以下を繰り返す。
    • 合計に Bi 問目の配点を加える。
  • 合計を出力する。

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

C++ の配列(Vectorコンテナ)A の添え字は0から始まります。一方、問題の添え字は1から始まっています。このため配列(Vectorコンテナ)B のそれぞれの要素は、1から始まるように記載されています。

問題の記述に合わせて、配列 A の添え字を1からNまで使えるようにします。このため、配列 A の宣言で要素数は、N + 1 になります(8行目)。またこの場合、A[0] は参照されません(9行目のfor文の範囲に含まれていない)。メリットとしては、読み込んだ Bi がそのまま合計を求める計算に使えます(17行目)。

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

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

int main()
{
	int n, m;
	cin >> n >> m;
	vector<int> a(n + 1);
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}

	int result = 0;
	for (int i = 0; i < m; ++i) {
		int b;
		cin >> b;
		result += a[b];
	}

	cout << result << endl;

	return 0;
}

別のプログラムも紹介します。

配列に無駄がでないように A を0から使います(8行目、9行目)。この場合は、読み込んだ Bi から1を引いた値で A にアクセスする必要があります(17行目)。

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

int main()
{
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}

	int result = 0;
	for (int i = 0; i < m; ++i) {
		int b;
		cin >> b;
		result += a[b - 1];
	}

	cout << result << endl;

	return 0;
}

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

Python プログラム例(ABC290A)

Python のリストも添え字は0から始まります。問題の記述を優先して添え字を1から開始するためには、読み込んだリスト A に対して、0番目の要素を追加します(4行目)。このため、読み込んだ Bi がそのまま合計を求める計算に使えます(9行目)。

"""AtCoder Beginner Contest 290 A"""
n, m = map(int, input().split())
a = list(map(int, input().split()))
a.insert(0, 0)
b = list(map(int, input().split()))

result = 0
for i in range(m):
    result += a[b[i]]

print(result)

C++版と同じようにリストを0から使うプログラムも紹介します。この場合は、読み込んだ Bi から1を引いた値で A にアクセスする必要があります(8行目)。

"""AtCoder Beginner Contest 290 A"""
n, m = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))

result = 0
for i in range(m):
    result += a[b[i] - 1]

print(result)

Python としては、こちらのプログラムの方が良いと思います。どちらも「AC」と判定されました。

最後に

多くのプログラミング言語では、入れ物(コンテナ)は0からカウントします。一方、問題文は1から始まる自然数で書く場合が多いようです。どちらかに決めてプログラムを書くのがよいと考えています。

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

COMMENT

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

CAPTCHA