Cod sursa(job #205335)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 30 august 2008 23:30:01
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;

#define maxn 210
#define min(a,b) (a < b ? a : b)
#define max(a,b) (a > b ? a : b)
#define inf 2000000000
#define maxl 2

int n, sol;
int a[maxn], b[maxn], p[maxn];
int c[maxn][maxn][maxl];

int cmp(int i, int j)
{
	return a[i] < a[j];
}

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

	scanf("%d ", &n);

	int i, x, y, k, v1, v2;

	for (i=1; i<=n; i++) 
	{
		scanf("%d %d ", &a[i], &b[i]);
		p[i] = i;
	}

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

	for (i=1; i<=n; i++) 
	{
		c[i][i][0] = b[p[i-1]] + b[p[i]] + a[p[i]] - a[p[i-1]];
		c[i][i][1] = b[p[i]] + b[p[i+1]] + a[p[i+1]] - a[p[i]];
	}

	for (i=1; i<n; i++)
		for (x=1; x+i<=n; x++)
		{
			y = x+i;
			c[x][y][0] = c[x][y][1] = inf;

			for (k=x; k<=y; k++)
			{
				if (x > 1) c[x][y][0] = min(c[x][y][0], max(c[x][k-1][1], c[k+1][y][0]) + b[p[k]] + a[p[k]] - a[p[x-1]] + b[p[x-1]]);
				if (y < n) c[x][y][1] = min(c[x][y][1], max(c[x][k-1][1], c[k+1][y][0]) + b[p[k]] + a[p[y+1]] - a[p[k]] + b[p[y+1]]);
			}
		}

	sol = inf;

	for (i=1; i<=n; i++)
	{
		v1 = v2 = 0;
		if (i>1) v1 = c[1][i-1][1];
		if (i < n) v2 = c[i+1][n][0];
		sol = min(sol, max(v1, v2) + b[p[i]] + abs(a[p[i]])); 
	}
	
	printf("%d\n", sol);

	return 0;
}