AtCoder

ABC318 A問題(Full Moon)を解く

AtCoder_ABC318_A

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

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

A問題 Full Moon(Difficulty : 14)

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

ABC318 A問題 Full Moon

問題をプログラムに変換して解くことができます。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 の問題を紹介していきます。

COMMENT

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

CAPTCHA