// #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); const int m = 100000; dp0[0][0 + m] = true; for(int i = 0; i < n; i++){ int dif = x[i] - (i == 0 ? 0 : x[i - 1]); for(int j = 0; j < 200002; j++){ if(!dp0[i][j])continue; //cerr << j << ' ' << dif << el; dp0[i + 1][j + dif] = true; if(i != 0)dp1[i + 1][j - dif] = true; } for(int j = 0; j < 200002; j++){ if(!dp1[i][j])continue; dp0[i + 1][j + dif] = true; dp1[i + 1][j - dif] = true; } } int ans = INT_MAX; for(int j = 0; j < 200002; j++){ if(dp1[n][j])ans = min(ans,abs(j - m)); } 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; }