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

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

JOI 一次予選 2020 (第 3 回) A - X に最も近い値 (7Q, 難易度 2)

いろんな解法がある!

問題概要

 L 以上  R 以下の整数のうち、 X との差の絶対値が最も小さいものを求めよ。

制約

  •  1 \le X \le 10^{5}
  •  1 \le L \le R \le 10^{5}

解法 (1):for

一番確実な方法は、for 文を用いて、 x = L, L+1, \dots, R をすべて調べることだと思われます。 |x - X| が最小となるような  x を求めればよいでしょう。

コード

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

int main() {
    int X, L, R;
    cin >> X >> L >> R;
    
    int min_value = 200000;  // 十分大きな値で初期化
    int min_x = -1;
    for (int x = L; x <= R; ++x) {
        int diff = abs(x - X);  // x と X との差
        if (diff < min_value) {
            min_value = diff;
            min_x = x;
        }
    }
    cout << min_x << endl;
}

 

解法 (2):場合分けする

数学的に処理してみましょう。

まず、 L \le X \le R のときは、 x = X のとき、 x X の差は 0 となります。これが明らかに最小です。

次に、 X \lt L のときは、 x = L のとき、 x X の差は  L - X となり、これが最小です。

最後に、 R \lt X のときは、 x = R のとき、 x X の差は  X - R となり、これが最小です。

コード

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

int main() {
    int X, L, R;
    cin >> X >> L >> R;
    
    if (X < L) cout << L << endl;
    else if (R < X) cout << R << endl;
    else cout << X << endl;
}