AtCoder が提供しているABC(AtCoder Beginner Contest)290 のA問題をC++とPythonで解いてみました。ABC290は、2023年2月19日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Contest Result(Difficulty : 9)
問題はリンク先をご覧ください。
指定された配列要素の合計を求めます。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 の問題を紹介していきます。