AtCoder が提供しているABC(AtCoder Beginner Contest)285 のA問題をC++とPythonで解いてみました。ABC285は、2023年1月15日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Edge Checker 2(Difficulty : 11)
問題はリンク先をご覧ください。
グラフの形を与えられて、条件を満たすか判定する問題です。AtCoder Problems による Difficulty は、11 でした。
解答案
問題を解く方針が2つあります。
- 直接結ばれている関係をすべて書き出し、確認する。
- 法則を見つけて、確認する。
Python プログラム例(ABC285A)
いつもとは異なり Python のプログラムを先に紹介します。直接結ばれている関係をタプルのリストとして表現して、そこに含まれているか判定しています。
"""AtCoder Beginner Contest 285 A"""
a, b = map(int, input().split())
if (a, b) in [(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7),
(4, 8), (4, 9), (5, 10), (5, 11),
(6, 12), (6, 13), (7, 14), (7, 15)]:
print("Yes")
else:
print("No")
タプルが14個あるため、行が長くなりました。Python のコーディングガイドラインPEP 8が推奨する79文字を超えるため折り返しました。リストの場合、行の連結は不要なようです(行連結をするために、\ を行末につけると、flake8 は警告を出力しました)。
次に法則を使うバージョンです。グラフの親と子の関係をみると、子の値を2で割って切り捨てた値が親になっていることが分かります。これを素朴にプログラムしました。
"""AtCoder Beginner Contest 285 A"""
a, b = map(int, input().split())
print("Yes" if b // 2 == a else "No")
どちらも AC(Accepted=正しいプログラム)と判定されました。
C++ プログラム例(ABC285A)
C++ では、法則を使うバージョンだけ紹介します。以下となります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
if (b / 2 == a) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
こちらも「AC」と判定されました。
最後に
このような簡単に見える問題でも解く方針は2つあります。それぞれのメリットがあるため、適宜使い分けていくことが良いと考えています。
引き続き ABC の問題を紹介していきます。