AtCoder が提供しているABC(AtCoder Beginner Contest)368 C問題をC++とPythonで解いてみました。ABC368は、2024年8月24日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 Triple Attack(Difficulty : 368)
問題の詳細は、リンク先をご覧ください。
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 の問題を紹介していきます。