Cod sursa(job #1689441)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 14 aprilie 2016 11:19:42
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const long long inf=(1LL<<60);

int n,i,j,x[205],y[205],k;
long long d[205][205], e[205][205] , stanga, dreapta, mijloc, ans;
pair<int,int> A[205];

int modul(int x)
{
    if(x>0) return x;
    return -x;
}

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

    scanf("%d", &n);

    for(i=1; i<=n; ++i) scanf("%d%d", &A[i].first, &A[i].second);

    sort(A+1, A+n+1);
    for(i=1; i<=n; ++i)
        x[i]=A[i].first, y[i]=A[i].second;

    for(i=1; i<=n+1; ++i)
    {
        d[i][i]=e[i][i]=y[i];
        for(j=i-1; j; --j)
            d[i][j]=e[i][j]=-inf;
    }

    for(i=n; i; --i)
    for(j=i+1; j<=n; ++j)
    {
        d[i][j]=inf;
        for(k=i; k<=j; ++k)
        {
            stanga=  e[i][k-1] + x[k]-x[k-1] + 2*y[k] + x[k]-x[i];
            dreapta= d[k+1][j] + x[k+1]-x[k] + 2*y[k] + x[k]-x[i];

            d[i][j]= min(d[i][j], max( stanga, dreapta) );
        }

        e[i][j]=inf;
        for(k=i; k<=j; ++k)
        {
            stanga=  e[i][k-1] + x[k]-x[k-1] + 2*y[k] + x[j]-x[k];
            dreapta= d[k+1][j] + x[k+1]-x[k] + 2*y[k] + x[j]-x[k];

            e[i][j]= min(e[i][j], max( stanga, dreapta));
        }
    }

    ans=inf;

    for(k=1; k<=n; ++k)
        ans=min( ans, modul(x[k]) + 2*y[k] + max( e[1][k-1]+x[k]-x[k-1], d[k+1][n]+x[k+1]-x[k] ) );

    printf("%lld\n", ans);

    return 0;
}