Cod sursa(job #125350)

Utilizator blasterzMircea Dima blasterz Data 20 ianuarie 2008 12:38:38
Problema Inundatii Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 4.37 kb
#include <cstdio>
#include<string>
#define maxn 50001


struct nod { int x, y, z;nod(){};nod(int a, int b, int c){x=a; y=b;z=c;};};

nod a[maxn];
int n;

void read()
{
  freopen("inundatii.in","r",stdin);
  scanf("%d\n", &n);
  int i;
  for(i=1;i<=n;++i) scanf("%d %d %d\n", &a[i].x, &a[i].y, &a[i].z);
  
}

inline int sgn(int a)
{
  if(a<0) return -a;
  return a;
}


inline long long dist(nod a, nod b)
{
  return (long long)sgn(a.x-b.x)+sgn(a.y-b.y)+sgn(a.z-b.z);
}

long long f(nod t)
{

  long long sum=0;
	int  i;
  sum+=(long long)dist(t, a[1]);
  for(i=2;i<=n;++i){ ++t.x; ++t.y; ++t.z; sum+=(long long)dist(t, a[i]);}
  return sum;
}
inline int min(int a, int b)
{
  if(a<b) return a;
  return b;
}

void solve()
{
  nod m,t;
  int i, j,k;
  m.x=0;m.y=0;m.z=0;
  long long mx=0, my=0, mz=0;
  for(i=1;i<=n;++i) mx+=(long long)a[i].x, my+=(long long)a[i].y, mz+=(long long)a[i].z;

  //printf("%d\n", n);
  mx/=n;
  my/=n;
  mz/=n;

m.x=mx;
m.y=my;
m.z=mz;
  int cnt=100000000;
  long long sum=0, sol=0x3f3f3f3f;
  
  sum+=dist(a[1], m);
#define ll long long
  for(i=2;i<=n;++i){++m.x; ++m.y;++m.z; sum+=(ll)dist(a[i], m);}
 
   m.x=mx;m.y=my;m.z=mz;
  /*
  for(i=1;i<=n;++i) m.x+=a[i].x, m.y+=a[i].y, m.z+=a[i].z;

  m.x/=n;
  m.y/=n;
  m.z/=n;
 */

  sol=sum;

  int ok;
#define cn continue
#define C 200000000
  while(cnt>0)
    {
      //ok=1;
      //      printf("%d\n", cnt);
      t.x=m.x+cnt;
      t.y=m.y;
      t.z=m.z;
      sum=f(t);
      if(sum<sol){ sol=sum; m=t;cn;}
      //sol=min(sum, sol);

      if(m.x-cnt>=0)
	{
	  t.x=m.x-cnt;
	  t.y=m.y;
	  t.z=m.z;
	  sum=f(t);
	  //sol=min(f(t), sol);
	  
	  if(sum<sol) { sol=sum;m=t;cn;}
	}

      
      t.x=m.x;
      t.y=m.y+cnt;
      t.z=m.z;
      sum=f(t);
      if(sum<sol) { sol=sum;m=t; cn;}

      if(m.y-cnt>=0)
	{
	  t.x=m.x;
	  t.y=m.y-cnt;
	  t.z=m.z;
	  sum=f(t);
	  if(sum<sol) { sol=sum;m=t;cn;}
	}

      t.x=m.x;
      t.y=m.y;
      t.z=m.z+cnt;
      sum=f(t);
      if(sum<sol){ sol=sum;m=t;cn;}
      
      
      if(m.z-cnt>=0)
	{

	  t.x=m.x;
	  t.y=m.y;
	  t.z=m.z-cnt;
	  sum=f(t);
	  if(sum<sol){ sol=sum;m=t;cn;}
	}      

	/*
      t.x=m.x+cnt;
      t.y=m.y+cnt;
      t.z=m.z;
      sum=f(t);
      if(sum<sol){ sol=sum;m=t;cn;}
      
      
      
      if(m.x-cnt>=0)
	{

	  t.x=m.x-cnt;
	  t.y=m.y+cnt;
	  t.z=m.z;
	  sum=f(t);
	  if(sum<sol) { sol=sum;m=t; cn;}
	}
      

      if(m.y-cnt>=0)
	{
	  t=nod(m.x+cnt, m.y-cnt, m.z);
	  sum=f(t);
	  if(sum<sol){sol=sum;m=t;cn;}
	}
      
      
      t=nod(m.x-cnt, m.y-cnt, m.z);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

      
      t=nod(m.x+cnt, m.y, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

 t=nod(m.x+cnt, m.y, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

t=nod(m.x-cnt, m.y, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

	
	t=nod(m.x-cnt, m.y, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}


	t=nod(m.x, m.y+cnt, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

      t=nod(m.x, m.y+cnt, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

     
	t=nod(m.x, m.y-cnt, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

t=nod(m.x, m.y-cnt, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}


	t=nod(m.x+cnt, m.y+cnt, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}


	t=nod(m.x+cnt, m.y+cnt, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

t=nod(m.x+cnt, m.y-cnt, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}


t=nod(m.x-cnt, m.y+cnt, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}


t=nod(m.x-cnt, m.y-cnt, m.z+cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

t=nod(m.x-cnt, m.y+cnt, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

t=nod(m.x+cnt, m.y-cnt, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

t=nod(m.x-cnt, m.y-cnt, m.z-cnt);
      sum=f(t);
      if(sum<sol) { sol=sum; m=t; cn;}

*/
     if(cnt!=0) cnt>>=1;
    }
      

freopen("inundatii.out","w",stdout);
  printf("%lld\n", sol); 
      


}


void solve2()
{

  int i, j, k;
  nod m;
  int sol=0x3f3f3f3f;
  for(i=0;i<=300;++i)
    for(j=0;j<=300;++j)
      for(k=0;k<=300;++k)
	{
	  m=nod(i, j, k);
	  sol=min(f(m), sol);
	}
  printf("%d\n", sol);

  m.x=2;
  m.y=2;
  m.z=0;
  printf("%d\n", f(m));
}


int main()
{
  read();
   solve();
   solve2();
}