module main; import std; // 集合の分割を列挙する T[][][] partition(T)(T[] arr, int k) { T[][][] result; void backtrack(int start, int k, T[][] currentPartition) { if (k == 1) { result ~= currentPartition ~ [arr[start .. $]]; return; } foreach (i; start .. arr.length.to!int - k + 1) backtrack(i + 1, k - 1, currentPartition ~ [arr[start .. i + 1]]); } backtrack(0, k, []); return result; } void main() { // 入力 auto N = readln.chomp.to!int; auto K = readln.chomp.to!int; double[] num; foreach (_; 0 .. N) { num ~= readln.chomp.to!double; } // 答えの計算 double max = -1e10, min = 1e10; foreach (p; partition(num, K)) { foreach (e; p) { double m = e.mean; if (max < m) max = m; if (min > m) min = m; } } // 答えの出力 writeln(ceil(max - min)); }