Cod sursa(job #479428)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 24 august 2010 00:54:55
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>

#include <algorithm>

using namespace std;

#define inf 2000000000

struct segm
{
	int x, y;
};
int n, st[202][202], dr[202][202];
segm v[202];

inline int min (int a, int b) {return a < b ? a : b;}
inline int max (int a, int b) {return a > b ? a : b;}
inline int abs (int a) {return a < 0 ? -a : a;}

inline int cmp (segm a, segm b)
{
	if (a.x != b.x)
		return a.x < b.x;
	return a.y < b.y;
}

int main ()
{
	freopen ("wanted.in", "r", stdin);
	freopen ("wanted.out", "w", stdout);
	
	int i, j, k, l;
	
	scanf ("%d", &n);
	for (i = 1; i <= n; i ++)
		scanf ("%d %d", &v[i].x, &v[i].y);
	
	sort (v + 1, v + n + 1, cmp);
	
	for (l = 1; l <= n; l ++)
		for (i = 1; i <= n - l + 1; i ++)
		{
			j = i + l - 1;
			st[i][j] = dr[i][j] = inf;
			for (k = i; k <= j; k ++)
			{
				st[i][j] = min (st[i][j], max (dr[i][k - 1], st[k + 1][j]) + v[k].y + v[i - 1].y + (v[k].x - v[i - 1].x));
				dr[i][j] = min (dr[i][j], max (dr[i][k - 1], st[k + 1][j]) + v[k].y + v[j + 1].y + (v[j + 1].x - v[k].x));
			}
		}
	
	int sol = inf;
	for (i = 1; i <= n; i ++)
		sol = min (sol, max (dr[1][i - 1], st[i + 1][n]) + v[i].y + abs (v[i].x));
	printf ("%d\n", sol);
	return 0;
}