Official

A - Water Station Editorial by MMNMM


AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。


計算がメインの解法と探索がメインの解法の \(2\) つを解説します。 これら以外の正しい解法も存在します。

解法 1

計算がメインの解法です。

全体を \(5\) で割って考えると、「\(x=\dfrac N5\) に最も近い整数を求める」ことになります。 これは \(x\) を小数部分で四捨五入することで求められます。

よって、答えは「 \(N\) を \(5\) で割ったあと四捨五入して整数にし、それを \(5\) 倍したもの」です。 これをプログラムにすることで正解することができます。

N = int(input())
print(round(N / 5) * 5)
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int N;
    cin >> N;
    cout << int(round(N / 5.0)) * 5 << endl;
    return 0;
}

\(\dfrac N5\) を浮動小数点数に変換する際に誤差が発生していますが、この問題の制約では正しい答えを出力することが証明できます。

また、次のように計算することで整数のまま(誤差を生じさせず)処理することもできます。 この式が正しいことの証明は省略します(ヒント:四捨五入 \(=\dfrac12\) を足して切り捨て)。

N = int(input())
print(((N + 2) // 5) * 5)
#include <iostream>
using namespace std;

int main() {
    int N;
    cin >> N;
    cout << ((N + 2) / 5) * 5 << endl;
    return 0;
}

解法 2

探索がメインの解法です。

答えの候補は \(0,5,10,\ldots,100\) の \(21\) 個です。 これらを全てチェックして、\(N\) との差がいちばん小さいものを出力することでこの問題を解くことができます。

N = int(input())

ans = 100
for i in range(0, 101, 5):
    if abs(N - ans) > abs(N - i):
        ans = i

print(ans)
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int N;
    cin >> N;

    int ans = 100;

    for (int i = 0; i <= 100; i += 5) {
        if (abs(N - ans) > abs(N - i)) {
            ans = i;
        }
    }

    cout << ans << endl;

    return 0;
}

posted:
last update: