Cod sursa(job #167983)

Utilizator damaDamaschin Mihai dama Data 30 martie 2008 14:53:53
Problema Wanted Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#include <algorithm>

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

using namespace std;

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

int max(int a, int b)
{
	if(a > b)
		return a;
	return b;
}

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

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

	scanf("%d", &n);

	for(i = 1; i <= n; ++i)
	{
		scanf("%d %d", &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] = temp;
		}
	}

	sol = inf;
	for(i = 1; i <= n; ++i)
	{
		if(sol > max(b[1][i], a[i][n]) + abs(p[i].x))
		{
			sol = max(b[1][i], a[i][n]) + abs(p[i].x);
		}
	}

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

	return 0;
}