Cod sursa(job #2011154)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 15 august 2017 12:39:36
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 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");


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;
    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);
        }
    }

    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)
{


    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);
}

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

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;
}