Pagini recente » Cod sursa (job #376688) | Cod sursa (job #9945) | Cod sursa (job #1331008) | Cod sursa (job #866448) | Cod sursa (job #163776)
Cod sursa(job #163776)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXN 201
int N;
vector< pair<int, int> > v;
#define X first
#define Y second
#define LL long long
LL bst[MAXN][MAXN][2];
#define FOR(i, a, b) for (int (i) = (a); (i) < (int)(b); ++(i))
inline LL MAX( LL a, LL b )
{
if (a > b)
return a;
return b;
}
int main()
{
freopen("wanted.in", "rt", stdin);
freopen("wanted.out", "wt", stdout);
scanf("%d", &N);
FOR(i, 0, N)
{
int X, Y;
scanf("%d %d", &X, &Y);
v.push_back( make_pair(X, Y) );
}
sort( v.begin(), v.end() );
for (int i = N - 1; i >= 0; i--)
{
bst[i][i][0] = bst[i][i][1] = v[i].Y;
FOR(j, i + 1, N) FOR(k, 0, 2)
{
bst[i][j][k] = 1LL << 60;
FOR(l, i, j + 1)
{
LL Cst, Worst = 0;
if (k == 0)
Cst = v[l].X - v[i].X;
else
Cst = v[j].X - v[l].X;
Cst += 2 * v[l].Y;
if (l > i)
Worst = MAX( Worst, bst[i][l - 1][1] + (v[l].X - v[l - 1].X) );
if (l < j)
Worst = MAX( Worst, bst[l + 1][j][0] + (v[l + 1].X - v[l].X) );
Cst += Worst;
if (Cst < bst[i][j][k])
bst[i][j][k] = Cst;
}
}
}
LL Min = 1LL << 60;
FOR(i, 0, N)
{
LL Cst;
if (v[i].X < 0)
Cst = -v[i].X;
else
Cst = v[i].X;
Cst += 2 * v[i].Y;
LL Worst = 0;
if (i > 0)
Worst = MAX( Worst, bst[0][i - 1][1] + (v[i].X - v[i - 1].X) );
if (i < N - 1)
Worst = MAX( Worst, bst[i + 1][N - 1][0] + (v[i + 1].X - v[i].X) );
Cst += Worst;
if (Cst < Min)
Min = Cst;
}
printf("%lld\n", Min);
return 0;
}