今の 300 点に比べると少し易しめで、でも 300 点っぽくていい感じだなと。
問題概要
個の整数 が与えられる。ここから 個の整数を選ぶ。
「選ばれた数の最大値と最小値の差」の最小値を求めよ。
制約
- <
考えたこと
すごく 300 点問題っぽくていい感じ。ソートして
- 番目と 番目の差
- 番目と 番目の差
- 番目と 番目の差
- ...
のうちの最小値を求めれば OK。
たったそれだけの問題ではあるけれど、最初にとりあえず数列をソートしてしまう、というのは多くの問題において重要なステップになるイメージがある。
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int N, K; cin >> N >> K; vector<long long> a(N); for (int i = 0; i < N; ++i) cin >> a[i]; // ソート sort(a.begin(), a.end()); // K 差の最小値 long long res = 1LL<<60; // INF の気持ち for (int i = 0; i+K-1 < N; ++i) res = min(res, a[i+K-1] - a[i]); cout << res << endl; }