Cod sursa(job #2149028)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 2 martie 2018 11:40:25
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#define INF 2000000000
using namespace std;
int modul (int x){
    if (x>=0)
        return x;
    return -x;
}
int d[2][201][201];
pair <int,int> v[201];
void maxoptim (int poz,int st,int dr){
    int drum,x;
    //if (st==1 && dr==1)
      //  printf ("%d %d\n",st,dr);
    if (d[poz][st][dr])
        return;
    if (st>dr)
        return ;
    d[poz][st][dr]=INF;
    if (st==dr){
        if (poz==0)
            d[poz][st][dr]=v[st].second+modul (v[st].first-v[st-1].first);
        else d[poz][st][dr]=v[st].second+modul (v[st].first-v[dr+1].first);
        return;
    }
    for (x=st;x<=dr;x++){
        if (!poz)
            drum=2*v[x].second+modul (v[x].first-v[st-1].first);
        else drum=2*v[x].second+modul (v[x].first-v[dr+1].first);
        maxoptim (0,x+1,dr);
        maxoptim(1,st,x-1);
        d[poz][st][dr]=min(d[poz][st][dr],drum + max(d[0][x+1][dr],d[1][st][x-1]));
    }
}
int main()
{
    FILE *fin=fopen ("wanted.in","r");
    FILE *fout=fopen ("wanted.out","w");
    int n,i;
    fscanf (fin,"%d",&n);
    for (i=1;i<=n;i++)
        fscanf (fin,"%d%d",&v[i].first,&v[i].second);
    sort (v+1,v+n+1);
    maxoptim(0,1,n);
    fprintf (fout,"%d",d[0][1][n]); // maxoptim e un fel de cautare binara la care ma duc pe ambele ramuri
    return 0;
}