Cod sursa(job #613799)

Utilizator darrenRares Buhai darren Data 4 octombrie 2011 19:44:26
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <utility>

using namespace std;

#define x first
#define y second

const int INF = (1LL << 31) - 1LL;

int N;
pair<int, int> V[202];
int minC[2][202][202];

inline int iabs(int x)
{
	return x < 0 ? -x : x;
}

int main()
{
	ifstream fin("wanted.in");
	ofstream fout("wanted.out");
	
	fin >> N;
	for (int i = 1; i <= N; ++i)
		fin >> V[i].x >> V[i].y;
	
	sort(V + 1, V + N + 1);
	
	for (int s = 1; s <= N; ++s)
		for (int i = 1; i <= N - s + 1; ++i)
		{
			minC[0][i][i + s - 1] = minC[1][i][i + s - 1] = INF;
			for (int j = i; j <= i + s - 1; ++j) // pivotul
			{
				minC[0][i][i + s - 1] = min(minC[0][i][i + s - 1], iabs(V[j].x - V[i - 1].x) + iabs(V[j].y) + iabs(V[i - 1].y) + max(minC[1][i][j - 1], minC[0][j + 1][i + s - 1]));
				
				if (i + s - 1 != N)
					minC[1][i][i + s - 1] = min(minC[1][i][i + s - 1], iabs(V[j].x - V[i + s].x) + iabs(V[j].y) + iabs(V[i + s].y) + max(minC[1][i][j - 1], minC[0][j + 1][i + s - 1]));
			}
		}
	
	fout << minC[0][1][N];
	
	fin.close();
	fout.close();
}