// #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using pii = pair; using pll = pair; #define TEST cerr << "TEST" << endl #define AMARI 998244353 // #define AMARI 1000000007 #define TIME_LIMIT 1980000 #define el '\n' #define El '\n' #define MULTI_TEST_CASE false void solve(void) { int l,n; cin >> l >> n; vector x(n); vector kireme(l,false); for(int i = 0; i < n; i++){ cin >> x[i]; } x.push_back(l); n++; //dp0[i] := 赤側を選んでる時の、i番目の切れ目まで見た時のありえるA-Bの値の集合 vector> dp0(n + 1),dp1(n + 1); dp0[0].insert(0); for(int i = 0; i < n; i++){ int dif = x[i] - (i == 0 ? 0 : x[i - 1]); for(set::iterator it = dp0[i].begin(); it != dp0[i].end(); it++){ dp0[i + 1].insert(*it + dif); if(i != 0)dp1[i + 1].insert(*it - dif); } for(set::iterator it = dp1[i].begin(); it != dp1[i].end(); it++){ dp0[i + 1].insert(*it + dif); dp1[i + 1].insert(*it - dif); } } int ans = INT_MAX; for(set::iterator it = dp1[n].begin(); it != dp1[n].end(); it++){ ans = min(ans,abs(*it)); } cout << ans << el; return; } void calc(void) { return; } signed main(void) { cin.tie(nullptr); ios::sync_with_stdio(false); calc(); int t = 1; if(MULTI_TEST_CASE) cin >> t; while(t--) { solve(); } return 0; }