けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 305 A - Water Station (灰色, 100 点)

この処理は今後めっちゃ頻出なので、スラスラ書けるようになっておきたい!

問題概要

正の整数  N が与えられる。

 N に最も近い 5 の倍数を求めよ。

解法

たとえば  N = 23 としてみよう。5 の倍数は

0, 5, 10, 15, 20, 25, 30, 35, 40, ...

と続いていくけど、これらのうち 23 を挟む「20」と「25」だけを考えれば良いことは明白だ。この場合、

  • 20 と 23 の差は 3
  • 25 と 23 の差は 2

であり、後者の方が小さいので答えは 25 となるわけだ。

一般の場合

問題なのは、与えられた整数  N に対して、「 N の前の 5 の倍数」 (23 に対する 20) と「 N の後ろの 5 の倍数」(23 に対する 25) をどのように求めるかだ。

これは頻出なのでぜひとも押さえておきたい。 N を 5 で割ってみればよいのだ。たとえば、 N = 23 のとき

23 ÷ 5 = 4 あまり 3

となる。このとき、5 × 4 = 20 が「23 の前の 5 の倍数」となっている。そして、それに 5 を足した 25 が、「23 の後ろの 5 の倍数」になっている。

よって、一般に

  •  N の前の 5 の倍数:N / 5 * 5 で求められる
  •  N の後ろの 5 の倍数:それに 5 を足して求められる

ということがわかった。あとは、これらを比べれば良い。

コード

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

int main() {
    int N;
    cin >> N;
    
    // N 以下の最大の 5 の倍数を求める
    int ika = N / 5 * 5;
    
    // N より大きい最小の 5 の倍数を求める
    int ue = ika + 5;
    
    // ika と ue のうち、N に近い方を答える
    int diff_ika = abs(ika - N);
    int diff_ue = abs(ue - N);
    if (diff_ika < diff_ue) cout << ika << endl;
    else cout << ue << endl;
}