Cod sursa(job #2147911)

Utilizator giotoPopescu Ioan gioto Data 1 martie 2018 11:13:19
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;

int n;
long long d[2][205][205];
struct Town{
    int x, y;
    bool operator < (const Town &aux) const{
        return x < aux.x;
    }
};
Town a[205];
inline void Solve(int st, int dr, int X, bool ok){
    if(d[ok][st][dr]) return ;
    if(st == dr){
        d[ok][st][st] = a[st].y + abs(X - a[st].x);
        return ;
    }
    d[ok][st][dr] = 20000000000;
    for(int i = st; i <= dr ; ++i){
        int dist = abs(X - a[i].x) + a[i].y * 2;
        if(st == 1 && dr == 4){
            bool ok = 0;

        }
        if(i == st) {
            Solve(st + 1, dr, a[i].x, 0);
            d[ok][st][dr] = min(d[ok][st][dr], d[0][st + 1][dr] + dist);
        }
        else if(i == dr){
            Solve(st, dr - 1, a[i].x, 1);
            d[ok][st][dr] = min(d[ok][st][dr], d[1][st][dr - 1] + dist);
        }
        else{
            Solve(st, i - 1, a[i].x, 1);
            Solve(i + 1, dr, a[i].x, 0);
            d[ok][st][dr] = min(max(d[1][st][i - 1] + dist, d[0][i + 1][dr] + dist), d[ok][st][dr]);
        }
    }
}
int main()
{
    freopen("wanted.in", "r", stdin);
    freopen("wanted.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n ; ++i)
        scanf("%d%d", &a[i].x, &a[i].y);
    sort(a + 1, a + n + 1);
    Solve(1, n, 0, 0);
    printf("%lld", d[0][1][n]);
    return 0;
}