//http://yukicoder.me/problems/780 #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int main() { int N, M; cin >> N >> M; vector D(M); for (int i = 0; i < M; i++) { cin >> D[i]; } sort(D.begin(), D.end()); int start = 1000000000; int cur = 0; for (int i = 0; i < M; i++) { if (start > abs(D[i])) { start = abs(D[i]); cur = i; } } typedef std::tuple t; //(-ans, cur, left, right, rest) priority_queue q; int ans = abs(D[cur]); q.push(make_tuple(-ans, cur, cur, cur, N - 1)); while (!q.empty()) { int rev_ans, left, right, rest; tie(rev_ans, cur, left, right, rest) = q.top(); q.pop(); ans = -rev_ans; if (rest == 0) break; if (left-1 >= 0) { int d = abs(D[left - 1] - D[cur]); q.push(make_tuple(rev_ans - d, left - 1, left - 1, right, rest - 1)); } if (right + 1 < M) { int d = abs(D[right + 1] - D[cur]); q.push(make_tuple(rev_ans - d, right + 1, left, right + 1, rest - 1)); } } cout << ans << endl; return 0; }