AtCoder

ABC368 C問題(Triple Attack)を解く

AtCoder_ABC368_C

AtCoder が提供しているABC(AtCoder Beginner Contest)368 C問題をC++とPythonで解いてみました。ABC368は、2024年8月24日21:00に実施されました。

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

C問題 Triple Attack(Difficulty : 368)

問題の詳細は、リンク先をご覧ください。

ABC368 C問題 Triple Attack

3回の操作を組で考えて、余った分を個別処理します。AtCoder Problems による Difficulty は 368 でした。

解答案

3回連続で操作をすれば、体力は、$1+1+3=5$ 減ります。余った分は、1減るか3減るかを判断しながら減らしていきます。$1 \leqq N \leqq 2 \times 10^5$ です。余った分で最大3回の演算をしても十分に処理可能です。

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

体力を 5 で割った商に 3 を掛けて、組として行う操作の回数を求めます(17、19行目)。5 で割った余りは、$T$ の値が3の倍数であれば 3 減らし、それ以外の場合は 1 減らします(20ー27行目)。

以下が、C++プログラムです。

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

typedef long long int ll;

int main()
{
	int n;
	cin >> n;
	vector<int> h(n);
	for (int i = 0; i < n; ++i) {
		cin >> h[i];
	}

	ll t = 0;
	for (int i = 0; i < n; ++i) {
		int q = h[i] / 5;
		int r = h[i] % 5;
		t += 3 * q;
		while (r > 0) {
			++t;
			if (t % 3 == 0) {
				r -= 3;
			} else {
				r -= 1;
			}
		}
	}

	cout << t << endl;

	return 0;
}

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

Python プログラム例(ABC368C)

Python版も基本的な考え方は同じです。以下がプログラムです。

"""AtCoder Beginner Contest 368 C"""
n = int(input())
h = list(map(int, input().split()))

t = 0
for i in range(n):
    q = h[i] // 5
    r = h[i] % 5
    t += 3 * q
    while r > 0:
        t += 1
        if t % 3 == 0:
            r -= 3
        else:
            r -= 1

print(t)

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

最後に

コンテストでACすることができましたが、見通しが悪いプログラムを書いていました。公式解説などを参考にして書き換えたプログラムを紹介しました。

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

COMMENT

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

CAPTCHA