Cod sursa(job #163603)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 22 martie 2008 14:48:35
Problema Wanted Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.68 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

const int n_max = 256;
const int INF = (1<<30);

pair <int , int > v[n_max];
int d[n_max][n_max][2];
int i, n, j, k, sol;

inline int maxim(int x, int y)
{
	if (x > y)
		return x;
	return y;
}
inline int minim(int x, int y)
{
	if (x < y)
		return x;
	return y;
}
inline int ABS(int x)
{
	if (x < 0)
		return -x;
	return x;
}
int main()
{
	freopen("wanted.in","r",stdin);
	freopen("wanted.out","w",stdout);
	sol = INF;
	scanf("%d", &n);
	for (i = 1; i <= n; ++ i)
		scanf("%d %d", &v[i].first, &v[i].second);
	sort(v+1, v+n+1);
	for (i = 1; i <= n; ++ i)
		for (j = 1; i+j <= n; ++ j)
		{
			d[i][i+j][0] = INF;	
			d[i][i+j][1] = INF;
		}
	for (i = 1; i <= n; ++i)
	{
		d[i][i][0] = v[i].second;
		d[i][i][1] = v[i].second;
	}

	for (i = 1; i <= n; ++ i)
		for (j = 1; i+j <= n; ++j)
			for (k = i; k <= i+j; ++ k)
			{
				int val = v[k].first-v[i].first +(v[k].second*2);
				int dd= 0, ds = 0;
				if ( k -1 >=i)
					dd = v[k].first-v[k-1].first;
				if ( k+1 <=j+i)
					ds = v[k+1].first-v[k].first;
				d[i][i+j][0] = minim(d[i][i+j][0], val + maxim(d[i][k-1][1]+ dd,d[k+1][i+j][0]+ds));
				val = v[i+j].first - v[k].first +(v[k].second*2);
				d[i][i+j][1] = minim(d[i][i+j][1], val + maxim(d[i][k-1][1]+ dd,d[k+1][i+j][0]+ds));
			}

	for (i = 1; i <= n; ++ i)
	{
		int val = ABS(v[i].first) + 2*v[i].second;
		int dd= 0, ds = 0;
				if ( i -1 > 0)
					dd = v[i].first-v[i-1].first;
				if ( i+1 <=n)
					ds = v[i+1].first-v[i].first;
		val +=maxim(d[1][i-1][1]+dd, d[i+1][n][0]+ds);
		sol = minim(sol, val);
	}
	printf("%d\n", sol);
	return 0;
}