Cod sursa(job #205489)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 1 septembrie 2008 12:06:55
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
using namespace std;

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <utility>
#include <functional>

#define pb psuh_back
#define x first
#define y second
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin()+1 , v.end()
#define C(v) C.erase( all(v) )
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)
#define mp make_pair
#define N_MAX 1<<9
#define CH 1<<14
#define oo 1<<30

#define IN "wanted.in"
#define OUT "wanted.out"

vector< pair<int,int>  > V(N_MAX);
int K(-1),N;
int A[N_MAX][N_MAX],B[N_MAX][N_MAX];
char buffer[CH];

inline int read()
{
	int aux(0);
	char semn(1);
	for(;buffer[K] > '9' || buffer[K] < '0';++K)
		semn = (buffer[K] == '-' ? -1 : semn);
	for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
		aux = aux * 10 + buffer[K] - '0';
	return aux*semn;
}

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	fread(buffer,1,CH,stdin);
	
	N = read();
	V.resize(N+1);
	FOR(i,1,N)
		V[i].x = read(),
		V[i].y = read();
	sort( all(V) );
}	

void solve()
{
	int rez(oo),worse;
	for(int i=0;++i<=N; A[i][i] = B[i][i] = V[i].y);
	FOR(d,1,N)
	FOR(i,1,N-d)
	{ 
		int j = i + d;
		A[i][j] = B[i][j] = oo;
		
		FOR(k,i+1,j-1)
		{
			worse = max(A[k+1][j] + V[k+1].x - V[k].x , B[i][k-1] + V[k].x - V[k-1].x);
			A[i][j] = min(A[i][j], worse + V[k].x - V[i].x + (V[k].y<<1) );
			B[i][j] = min(B[i][j], worse + V[j].x - V[k].x + (V[k].y<<1) );
		}
		
		//cazul k=i
		A[i][j] = min(A[i][j], (V[i].y<<1) + V[i+1].x - V[i].x + A[i+1][j]);
		B[i][j] = min(B[i][j], (V[i].y<<1) + V[j].x + V[i+1].x - (V[i].x<<1) + A[i+1][j]);
		
		//cazul k=j
		A[i][j] = min(A[i][j], (V[j].y<<1) + (V[j].x<<1) - V[i].x - V[j-1].x + B[i][j-1]);
		B[i][j] = min(B[i][j], (V[j].y<<1) + V[j].x - V[j-1].x + B[i][j-1]);
	}

	FOR(i,2,N-1)
		rez = min(rez, abs(V[i].x) + (V[i].y<<1) + max(V[i].x - V[i-1].x + B[1][i-1] , V[i+1].x - V[i].x + A[i+1][N]));

//	rez = min(rez,abs(V[1].x) + (V[1].y<<1) + V[2].x - V[1].x + A[2][N]);
//	rez = min(rez,abs(V[N].x) + (V[N].y<<1) + V[N].x - V[N - 1].x + B[1][N - 1]);
	printf("%d\n",rez);
}	

int main()
{
	scan();
	solve();
	return 0;
}