#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include "util.h" using namespace std; typedef unsigned uint; typedef long long ll; typedef unsigned long long ull; //呪文 template ostream& operator << (ostream& ostr, const pair<_KTy, _Ty>& m) { cout << "{" << m.first << ", " << m.second << "}"; return ostr; } template ostream& operator << (ostream& ostr, const map<_KTy, _Ty>& m) { if (m.empty()) { cout << "{ }"; return ostr; } cout << "{" << *m.begin(); for (auto itr = ++m.begin(); itr != m.end(); itr++) { cout << ", " << *itr; } cout << "}"; return ostr; } template ostream& operator << (ostream& ostr, const vector<_Ty>& v) { if (v.empty()) { cout << "{ }"; return ostr; } cout << "{" << v.front(); for (auto itr = ++v.begin(); itr != v.end(); itr++) { cout << ", " << *itr; } cout << "}"; return ostr; } template ostream& operator << (ostream& ostr, const set<_Ty>& s) { if (s.empty()) { cout << "{ }"; return ostr; } cout << "{" << *(s.begin()); for (auto itr = ++s.begin(); itr != s.end(); itr++) { cout << ", " << *itr; } cout << "}"; return ostr; } template void print(T* v, int N) { if (N == 0) cout << "{ }"; cout << "{" << v[0]; for (int i = 1; i < N; i++) cout << ", " << v[i]; cout << "}"; } #define PI 3.14159265358979323846 #define EPS 1e-8 #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) #define all(x) (x).begin(), (x).end() #define INF 99999 int yuki0370() { int N, M; cin >> N >> M; bool zero = false; vector right, left; // 左右に落ちている i 個目のゴミの位置 right.push_back(0); left.push_back(0); int D; for (int i = 0; i < M; i++) { cin >> D; if (D < 0) left.push_back(-D); else if (D > 0) right.push_back(D); else zero = true; } sort(all(right)); sort(all(left)); int ans = INF; // ゴミが 0 に落ちている if (zero) N--; // 右のゴミを r 個拾うとき for (int r = 0; r <= min(N, (int)(right.size() - 1)); r++) { // 左のゴミは N - r 個拾う int l = N - r; // 拾えない if (l >= left.size()) continue; int dist; // 右のみ拾う if (l == 0) dist = right[r]; // 左のみ拾う else if (r == 0) dist = left[l]; // 右から拾う場合と左から拾う場合 else dist = min(2 * right[r] + left[l], 2 * left[l] + right[r]); // 最短距離更新 if (ans > dist) ans = dist; } cout << ans << endl; return 0; } int main() { //clock_t start, end; //start = clock(); yuki0370(); //end = clock(); //printf("%d msec.\n", end - start); return 0; }