AtCoder

ABC332 B問題(Glass and Mug)を解く

AtCoder_ABC332_B

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

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

B問題 Glass and Mug(Difficulty : 76)

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

ABC332 B問題 Glass and Mug

与えられた操作をプログラムとして実行するだけです。AtCoder Problems による Difficulty は 76 でした。

解答案

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

3種類の操作をプログラムとして書くだけです。グラスに入っている水を rg、マグカップに入っている水を rm とします。

  • グラスに g 入っていれば、空にする(11、12行目)。
  • マグカップが空であれば、m 水を入れる(13、14行目)。
  • グラスの残り(gーrg)とマグカップに入っている rm を比較して、グラスに g 入るか、マグカップが空になります(16ー23行目)。

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

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

int main()
{
	int k, g, m;
	cin >> k >> g >> m;
	int rg = 0;
	int rm = 0;
	for (int i = 0; i < k; ++i) {
		if (rg == g) {
			rg = 0;
		} else if (rm == 0) {
			rm = m;
		} else {
			int t = g - rg;
			if (rm <= t) {
				rg += rm;
				rm = 0;
			} else {
				rg = g;
				rm -= t;
			}
		}
	}

	cout << rg << " " << rm << endl;

	return 0;
}

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

Python プログラム例(ABC332B)

Python 版も基本的な考え方は同じです。以下となります。

"""AtCoder Beginner Contest 332 B"""
k, g, m = map(int, input().split())
rg = 0
rm = 0
for i in range(k):
    if rg == g:
        rg = 0
    elif rm == 0:
        rm = m
    else:
        t = g - rg
        if rm <= t:
            rg += rm
            rm = 0
        else:
            rg = g
            rm -= t

print(rg, rm)

こちらも「AC」と判定されました。

最後に

このような問題は数学的に解きたくなりますが、制約が間に合うのであれば、素朴に実装です。

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

COMMENT

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

CAPTCHA