#include #include #include #define MAX_M 1000 using namespace std; int main(){ int n,m; cin >> n;//ひろうゴミの数 cin >> m;//落ちているゴミの総数 int D[MAX_M]; int min_len = 9999999; int len = 0; for(int d = 0; d < m; d++) cin >> D[d]; /* N個のごみを拾うための最短距離 距離がマイナスのところのゴミを拾うとき、 */ sort(D, D + m);//とりあえずソートする() /* 距離がマイナスのところだけをひろう → 一番遠いところのABS取る 距離がプラスのところだけをひろう →一番遠いところのABSを取る 距離がプラスとマイナスのところをひろう → マイナスの座標の絶対値の2倍+プラスの座標が答え(一回戻る必要がある) マイナスとプラスの座標のゴミをひろうとき、どっちからひろうかで最短距離が変わることに注意がいる。 →プラスが15、マイナスが10の時:プラスの方からひろうと15*2+10=40だが、マイナスからならば10*2+15=35 になり最短距離がでる。 */ // cout << endl; for(int d = 0; d < m - n + 1; d++){ // cout << "D[" << d << "] :" << D[d]; // cout << " | D[" << d + n - 1 << "] :" << D[d+n-1] << endl; if(D[d] <= 0 && D[d+n-1] <= 0){//座標がマイナスのところだけ len = -D[d]; } else if(D[d] >= 0 && D[d+n-1] >= 0){//座標がプラスのところだけ len = D[d+n-1]; } else { len = min(D[d+n-1]*2-D[d],D[d+n-1] - D[d] * 2);//マイナスの座標のぶんだけ最初行ってからでないとだめ } if(len < min_len){ min_len = len; // cout << "更新 "; } // cout << "len:" << len << endl; len = 0; } cout << min_len << endl; return 0; }