Cod sursa(job #163577)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 22 martie 2008 14:47:32
Problema Wanted Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.43 kb
#include <stdio.h>
#include <stdlib.h>
#define inf 2000000000
#define abs(a) ((a<0)?-a:a)

long n,x[205],y[205],ind[205];
long dmax;

int comp(const void * n1, const void * n2){
    return (x[*((long*)n1)]-x[*((long*)n2)]);
}

void dist(long d, long xx, long yy, long st, long dr){
     if (st<=dr){
        long i,ma=0,min,p;
        for (i=st;i<=dr;i++) 
            if (abs((xx-x[ind[i]]))+y[ind[i]]>ma)ma=abs((xx-x[ind[i]]))+y[ind[i]];
        ma/=2;
        min=inf;p=0;
        for (i=st;i<=dr;i++)
            if (abs((abs((xx-x[ind[i]]))+y[ind[i]]-ma))<min){
               min=abs((xx-x[ind[i]]))+y[ind[i]];
               p=i;
            }
        dist(d+yy+abs((xx-x[ind[p]]))+y[ind[p]], x[ind[p]], y[ind[p]],p+1,dr);
        dist(d+yy+abs((xx-x[ind[p]]))+y[ind[p]], x[ind[p]], y[ind[p]],st,p-1);
        
     }      
     else if (d>dmax)dmax=d;
}

int main(){
    freopen("wanted.in","r",stdin);
    freopen("wanted.out","w",stdout);
    
    long i,p,min=inf;
    
    scanf("%ld",&n);
    for (i=1;i<=n;i++){
        scanf("%ld %ld",&x[i],&y[i]);
        ind[i]=i;
    }
    qsort(ind+1,n,sizeof(long),comp);
    
    for (i=1;i<=n;i++)
        if (abs(x[ind[i]])+y[ind[i]]<min){p=i;min=abs(x[ind[i]])+y[ind[i]];}
    
    dist(abs(x[ind[p]])+y[ind[p]],x[ind[p]],y[ind[p]],p+1,n);
    dist(abs(x[ind[p]])+y[ind[p]],x[ind[p]],y[ind[p]],1,p-1);
    
    printf("%ld\n",dmax);
    
return 0;
}