AtCoder が提供しているABC(AtCoder Beginner Contest)318 のA問題をC++とPythonで解いてみました。ABC318は、2023年9月2日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
A問題 Full Moon(Difficulty : 14)
問題はリンク先をご覧ください。
問題をプログラムに変換して解くことができます。AtCoder Problems による Difficulty は 14 でした。
解答案
C++ プログラム例(ABC318A)
次の操作が何回できるかをカウントします(10ー13行目)。カウントした値を出力します。
- $M \leqq N$ を満たす限り、$M$ に $P$ を加える。
以下が、C++プログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m, p;
cin >> n >> m >> p;
int result = 0;
while (m <= n) {
++result;
m += p;
}
cout << result << endl;
return 0;
}
この問題は、ひとつの式で解くことができます(12行目)。ただし、解が0になる場合があるので注意が必要です。この場合は、以下のプログラムとなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m, p;
cin >> n >> m >> p;
if (m > n) {
cout << 0 << endl;
} else {
cout << (n - m) / p + 1 << endl;
}
return 0;
}
どちらも AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC318A)
Python 版も基本的な考え方は同じです。以下となります。
"""AtCoder Beginner Contest 318 A"""
n, m, p = map(int, input().split())
result = 0
while m <= n:
result += 1
m += p
print(result)
ひとつの式で書いたプログラムは以下となります。
"""AtCoder Beginner Contest 318 A"""
n, m, p = map(int, input().split())
print(0 if m > n else (n - m) // p + 1)
どちらも「AC」と判定されました。
最後に
実際のコンテストでは、後者のプログラムを提出しました。ただし、AC判定をもらったのは、6分23秒でした。入力例にない場合も確認していたため時間がかかりました。
前者のプログラムを素早く書いて、もう数分速くだすことができたと考えています。A問題やB問題では、少し平易な方法で速く提出する方がよいかもしれません。
引き続き ABC の問題を紹介していきます。