Pagini recente » Cod sursa (job #3004880) | Cod sursa (job #2250508) | Cod sursa (job #1377828) | Cod sursa (job #998050) | Cod sursa (job #163497)
Cod sursa(job #163497)
#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;
}