int N; int A[1000][2]; int dp[1<<18][18]; inline int dist(int i, int j) { return A[i][1] - A[i][0] + A[j][0]; } { rd(N); REP(i, N) { int a, b; rd(a, b); A[i][0] = a; A[i][1] = b; } fill(dp[1], dp[1<<N], int(1e9)); REP(i, N) { dp[0][i] = 0; dp[1<<i][i] = 0; } REP(b, 1, 1 << N) { REP(i, N) { if (~b & (1 << i)) continue; REP(j, N) { if (b & (1 << j)) continue; dp[b | (1 << j)][j] = min(dp[b | (1 << j)][j], max(dp[b][i], dist(i, j)) ); } } } int best = 1e9; REP(i, N){ best = min(best, dp[(1<<N)-1][i]); } wt(best); }