Cod sursa(job #163497)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 22 martie 2008 13:48:36
Problema Wanted Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 10-a Marime 1.53 kb
#include<stdio.h>
FILE*fin=fopen("wanted.in","r");
FILE*fout=fopen("wanted.out","w");
#define maxn 201
#define max(a,b)((a)>(b)?(a):(b))
int n,d[maxn][maxn],x[maxn],y[maxn];
int m(int a)
{
  if(a>=0) return a;
  else return -a;
}
void ord()
{
  int o=0,i;
  while(!o)
  {
    o=1;
    for(i=1;i<n;i++)
      if(x[i]>x[i+1])
      {
	o=0;
	x[i]^=x[i+1]^=x[i]^=x[i+1];
	y[i]^=y[i+1]^=y[i]^=y[i+1];
      }
  }
}
int rec(int med,int st,int dr)
{
  int meds,medd,nb,i,v1,v2;
  double cer,ds,bds=100000;
  if(st>=dr) return 0;
  if(st!=med)
  {
    cer=(d[med][st]+d[med][med-1])/2;
    for(i=st;i<=med-1;i++)
    {
      ds=cer-d[med][i];
      if(ds<0) ds=-ds;
      if(ds<bds){bds=ds;nb=i;}
    }
    meds=nb;
  }
  else meds=med;
  bds=100000;
  if(dr!=med)
  {
    cer=(d[med][med+1]+d[med][dr])/2;
    for(i=med+1;i<=dr;i++)
    {
      ds=cer-d[med][i];
      if(ds<0) ds=-ds;
      if(ds<bds||(ds==bds&&d[med][i]>d[med][nb])){bds=ds;nb=i;}
    }
    medd=nb;
  }
  else medd=med;
  v1=d[med][medd]+rec(medd,med+1,dr);
  v2=d[med][meds]+rec(meds,st,med-1);
  return max(v1,v2);
}
int main()
{
  int i,ns,dist=30000,j;
  fscanf(fin,"%d",&n);
  for(i=1;i<=n;i++)
    fscanf(fin,"%d%d",&x[i],&y[i]);
  fclose(fin);
  ord();
  for(i=1;i<=n;i++)
    d[i][i]=0;
  for(i=1;i<=n;i++)
  {
    if(dist>m(x[i])+y[i]){dist=m(x[i])+y[i];ns=i;}
    for(j=i+1;j<=n;j++)
    {
      d[i][j]=d[j][i]=x[j]-x[i]+y[j]+y[i];
    }
  }
  fprintf(fout,"%d",dist+rec(ns,1,n));
  fclose(fout);
  return 0;
}