#include <bits/stdc++.h>
using namespace std;
const int maxn = 1E4 + 10;
const int INF = 0x3f3f3f3f;
int n, ans, dp[maxn][maxn][2], dis[maxn], deadline[maxn];
int main(int argc, char const *argv[])
{
while (cin >> n)
{
for (int i = 1; i <= n; i++)
cin >> dis[i] >> deadline[i];
for (int i = n; i >= 1; i--)
for (int j = i + 1; j <= n; j++)
{
dp[i][j][0] = dp[i][j][1] = INF;
ans = min(dp[i + 1][j][0] + dis[i + 1] - dis[i], dp[i + 1][j][1] + dis[j] - dis[i]);
if (ans < deadline[i]) dp[i][j][0] = min(dp[i][j][0], ans);
ans = min(dp[i][j - 1][0] + dis[j] - dis[i], dp[i][j - 1][1] + dis[j] - dis[j - 1]);
if (ans < deadline[j]) dp[i][j][1] = min(dp[i][j][1], ans);
}
ans = min(dp[1][n][0], dp[1][n][1]);
if (ans == INF) cout << "No solution" << endl;
else cout << ans << endl;
}
return 0;
}
区间头尾dp