Cod sursa(job #163556)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 22 martie 2008 14:46:43
Problema Wanted Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.5 kb
#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;
}