Cod sursa(job #168149)

Utilizator damaDamaschin Mihai dama Data 30 martie 2008 20:15:48
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>
#include <algorithm>

const long long inf = 2000000001;
#define x first
#define y second

using namespace std;

int n;
long long a[201][201], b[201][201];
pair<long long, long long> p[210];

long long max(long long a, long long b)
{
	if(a > b)
		return a;
	return b;
}
long long modul(long long a)
{
	if(a < 0)
		return -a;
	return a;
}

int main()
{
	freopen("wanted.in", "r", stdin);
	freopen("wanted.out", "w", stdout);

	int i, d, j, k;
	long long min, sol, temp;

	scanf("%d", &n);

	for(i = 1; i <= n; ++i)
	{
		scanf("%lld %lld", &p[i].x, &p[i].y);
	}

	sort(p + 1, p + n + 1);

	for(i = 1; i <= n; ++i)
	{
		a[i][i] = b[i][i] = p[i].y;
	}

	for(d = 1; d < n; ++d)
	{
		for(i = 1; i + d <= n; ++i)
		{
			min = 2 * p[i].y + p[i + 1].x - p[i].x + a[i + 1][i + d];
			for(j = 1; j < d; ++j)
			{
				temp = 2 * p[i + j].y + p[i + j].x - p[i].x + max(p[i + j + 1].x - p[i + j].x + a[i + j + 1][i + d], p[i + j].x - p[i + j - 1].x + b[i][i + j - 1]);
				if(min > temp)
				{
					min = temp;
				}
			}
			
			temp = 2 * p[i + d].y + p[i + d].x - p[i + d - 1].x + p[i + d].x - p[i].x + b[i][i + d - 1];
			if(min > temp)
			{
				min = temp;
			}
			a[i][i + d] = min; 
			min = 2 * p[i + d].y + p[i + d].x - p[i + d - 1].x + b[i][i + d - 1];
			for(j = d - 1; j > 0; --j)
			{
				temp = 2 * p[i + j].y + p[i + d].x - p[i + j].x + max(p[i + j].x - p[i + j - 1].x + b[i][i + j - 1], p[i + j + 1].x - p[i + j].x + a[i + j + 1][i + d]);
				if(min > temp)
				{
					min = temp;
				}
			}
			temp = 2 * p[i].y + p[i + d].x - p[i].x + p[i + 1].x - p[i].x + a[i + 1][i + d];
			if(min > temp)
			{
				min = temp;
			}
			b[i][i + d] = min;
			//printf("%d %d %lld %lld\n", i, i + d, a[i][i + d], b[i][i + d]); 
		}
	}
	//printf("\n");

	sol = inf;
	for(i = 1; i <= n; ++i)
	{
		//printf("%lld %lld %lld\n", b[1][i], a[i][n], modul(p[i].x));
		if(sol > max(b[1][i - 1] + 2 * p[i].y + p[i].x - p[i - 1].x, 2 * p[i].y + p[i + 1].x - p[i].x + a[i + 1][n]) + modul(p[i].x))
		{
			sol = max(b[1][i - 1] + 2 * p[i].y + p[i].x - p[i - 1].x, 2 * p[i].y + p[i + 1].x - p[i].x + a[i + 1][n]) + modul(p[i].x);
		}
	}

	printf("%lld\n", sol);

	return 0;
}