#include ifstream input; ofstream output; int n, m; long minsum[301][31]; int bestmove[301][31]; int citypos[300]; long huge minlocalsum[300][300]; long absval (long x) { if (x >= 0) return x; else return -x; } long getminsum(int a, int b) { long bestsum = 5000000l; if (a == n && b <= m) return 0; if (b >= m) return bestsum; if (minsum[a][b] != -1) return minsum[a][b]; for (int i = a; i < n; i++) { long thissum = minlocalsum[a][i] + getminsum (i+1, b+1); if (thissum < bestsum) { bestsum = thissum; bestmove[a][b] = i; } } minsum[a][b] = bestsum; // output << "minsum[" << a << "][" << b << "] = " << minsum[a][b] << "\n"; return bestsum; } int main() { int i, j, k; input.open ("post.in"); output.open ("post.out"); for (i = 0; i <= 300; i++) for (j = 0; j <= 30; j++) minsum[i][j] = -1; input >> n; input >> m; for (i = 0; i < n; i++) input >> citypos[i]; for (i = 0; i < n; i++) for (j = i; j < n; j++) { long sum = 0; for (k = i; k <= j; k++) sum += absval(citypos[k] - citypos[i+(j-i)/2]); minlocalsum[i][j] = sum; } // cout << minlocalsum[0][1] << "\n"; long answer = getminsum(0,0); output << answer << "\n"; int nextspot = 0; for (i = 0; i < m; i++) { output << citypos[nextspot+(bestmove[nextspot][i] - nextspot)/2]; if (i == m-1) output << "\n"; else output << " "; nextspot = bestmove[nextspot][i] + 1; } input.close (); output.close (); return 0; }