ABC203 B 解答
B - AtCoder Condominium(12)
問題
問題文
AtCoder マンションは 1 階から N 階までの N 階建てのマンションです。 各階には K 室の部屋があり、1 号室から K 号室まで番号が振られています。
ここで N, K は 1 桁の整数であり、i 階の j 号室の部屋番号は i0j で表されます。 例えば、1 階の 2 号室の部屋番号は 102 です。
マンションの管理人である高橋君は各部屋番号を 3 桁の整数とみなし、 AtCoder マンションに存在するすべての部屋について足しあわせたらいくつになるのか興味を持ちました。 その値を求めてください。
制約
1 ≤ N, K ≤ 9
N, K は整数である。
考察
制約を見てみましょう。N,Kともに最大でも9までです。ということは一番大きなマンションでも、部屋の数は
9*9 = 81
となります。これくらいなら全部の部屋を一つずつ足しても間に合いそうですね。ということで、部屋番号を数字で表すということを考えましょう。
問題文にもある通り
i 階の j 号室の部屋番号は i0j
になるそうです。これを三桁の数と考えると、
100の位:i
10の位:0
1の位:j
となります。ですので、これを数字で表しますと、
100 * i + j
になりますね。これを入力された階数、号室だけ足し合わせると答えが求まります。
ここで一つ注意です。通常for文は0番目からカウントします。簡単に1始まりに変更可能ですが、意識していないと忘れてしまいます。逆に終了はN-1やK-1となります。0からN-1まで回すことで、N 回の処理が行われます。
きちんと1からNまたはKまで回すようにしましょう。
実装
#include <bits/stdc++.h> #define rep(i,n) for(int i=0;i<n;++i) #define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
int main()
{
int n, k;
cin >> n >> k;
int ans = 0;
reps(i, 1, n + 1)reps(j, 1, k+1)
{
ans += 100 * i + j;
}
cout << ans << endl;
return 0;
}
あとがき
今回は、プログラム上部のマクロでrepsというものを定義しています。これにより、1始まりのfor文を使用しています。普通に書く場合は
for(int i=1; i <= N; ++i)
こんな感じでしょうか。0で始めて+1の値で計算する方法もあります。とにかく、1番目の数字から計算するようにしましょう。
この記事が気に入ったらサポートをしてみませんか?