Pagini recente » Cod sursa (job #781107) | Cod sursa (job #2216995) | Cod sursa (job #1625620) | Cod sursa (job #2334155) | Cod sursa (job #168318)
Cod sursa(job #168318)
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
#define NMAX 256
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define INF 0x3f3f3f3f
vector< pair<int,int> > v;
pair<int,int> a[NMAX][NMAX];
int n;
inline int dist( int x, int y)
{
int ret;
ret=abs( v[x].ff - v[y].ff ) + v[x].ss + v[y].ss;
return ret;
}
int main()
{
freopen("wanted.in","r",stdin);
freopen("wanted.out","w",stdout);
int x,y,i,j,k,cx,cy;
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
v.pb( mp(x, abs(y) ) );
}
sort(v.begin(),v.end());
for (i=0;i<n;i++)
{
a[i][i].ff=0;
a[i][i].ss=0;
}
for (i=0;i<n-1;i++)
{
a[i][i+1].ff=dist(i,i+1);
a[i][i+1].ss=dist(i,i+1);
}
for (j=2;j<n;j++)
for (i=0;i+j<n;i++)
{
cx=INF;cy=INF;
x=i;y=i+j;
for (k=x+1;k<y;k++)
{
if (k==x+1) cx=min(cx, a[k][y].ff + dist(x,k) );
else cx=min(cx, max( a[x][k].ss,a[k][y].ff ) + dist(x,k) );
if (k==y-1) cy=min(cy, a[x][k].ff + dist(y,k) );
else cy=min(cy, max( a[x][k].ss,a[k][y].ff ) + dist(k,y) );
}
a[x][y].ff=cx;
a[x][y].ss=cy;
}
int sol=INF;
for (i=0;i<n;i++)
sol=min(sol, max(a[0][i].ss,a[i][n-1].ff) + abs(v[i].ff) + v[i].ss );
printf("%d",sol);
return 0;
}