Cod sursa(job #1413021)

Utilizator ZenusTudor Costin Razvan Zenus Data 1 aprilie 2015 18:08:01
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <algorithm>
#include <climits>

using namespace std;

#define NMAX 207

pair < int , int > a[NMAX];
int h[NMAX],x[NMAX];
int d[NMAX][NMAX][2];
int N,i,c,j,len,k,ans;

int main()
{
ifstream f("wanted.in");
ofstream g("wanted.out");

//d[len][i][0] = costul pentru a investiga i...i+len-1 venind din i-1
//d[len][i][1] = costul pentru a investiga i...i+len-1 venind din i+len

f >> N;

for (i=1;i<=N;++i)
f >> a[i].first >> a[i].second;

sort(a+1,a+N+1);

for (i=1;i<=N;++i)
{
    x[i] = a[i].first;
    h[i] = a[i].second;
}

for (i=2;i<=N;++i)
d[1][i][0] = (x[i] - x[i-1]) + h[i];

for (i=1;i<=N-1;++i)
d[1][i][1] = (x[i+1] - x[i]) + h[i];

for (len=2;len<=N-1;++len)
for (i=1;i<=N-len+1;++i)
{
    j = i + len - 1;
    //investighez i...j

    //plec din i-1
    if (i-1 >= 1)
    {
        d[len][i][0] = INT_MAX;
        for (k=i;k<=j;++k)
        {
            c = max(d[k-i][i][1] , d[j-k][k+1][0]) + 2*h[k] + x[k] - x[i-1];
            d[len][i][0] = min ( d[len][i][0] , c);
        }
    }

    //plec din j+1
    if (j+1<=N)
    {
        d[len][i][1] = INT_MAX;
        for (k=i;k<=j;++k)
        {
            c = max(d[k-i][i][1] , d[j-k][k+1][0]) + 2*h[k] + x[j+1] - x[k];
            d[len][i][1] = min(d[len][i][1] , c);
        }
    }
}

ans = INT_MAX;
for (i=2;i<=N-1;++i)
{
    // i este pivotul , adica in el ma duc prima data din 0

    c = max(d[i-1][1][1] , d[N-i][i+1][0]) + ((x[i]<0) ? -x[i] : x[i]) + 2*h[i];
    ans = min(ans,c);
}

// pivotul este 1
c = d[N-1][2][0] + ((x[1]<0) ? -x[1] : x[1]) + 2*h[1];
ans = min(ans,c);

//pivotul este N
c = d[N-1][1][1] + ((x[N]<0) ? -x[N] : x[N]) + 2*h[N];
ans = min(ans,c);

g << ans << '\n';

return 0;
}