めっちゃ面白い問題!! 実はよく似た類題として次の問題がある!
問題概要
長さが の数列 が与えられる。この数列から 個の要素を削除する。
残った数からなる数列中の、最大値と最小値の差の最小値を求めよ。
制約
考えたこと
「 個削除する」というのは、「 個選び出す」と捉えた方が考えやすいので、そう考えることにしよう。改めて とおく。
直観的には、数列 をソートした場合において、「連続する 個を選ぶ」とする場合にみ考えればよいと思われる。このことを一応検証してみよう。数列 はソート済みであるとしよう。
数列 から選ぶ要素のうちの最小値 を固定して考えてみるとハッキリする。このとき、 から 個選んだときの最大値をなるべく小さくしたい。そうすると、 からスタートして小さい順に 個選べばよいことがわかる。
まとめると、 を小さい順に並べた上で、 の値の最小値を求めればよい。計算量は となる。
コード
#include <bits/stdc++.h> 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()); long long res = A.back() - A[0]; for (int i = 0; i + (N - K) - 1 < N; ++i) { long long diff = A[i + (N - K) - 1] - A[i]; res = min(res, diff); } cout << res << endl; }