Nu aveti permisiuni pentru a descarca fisierul grader_test4.ok

Cod sursa(job #168616)

Utilizator alexeiIacob Radu alexei Data 31 martie 2008 17:54:30
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<stdio.h>
#include<stdlib.h>
#define nmax 300
#define max(a,b) ((a)>(b)?(a):(b))

int pozx[nmax],pozy[nmax];
int a[nmax][nmax],b[nmax][nmax];

inline int min(int a1,int a2)
{
 if( !a1 )
 return a2;
 if( a1< a2)
 return a1;
 return a2;

}
int schimb(int st,int dr)
{
 int x=pozx[st];
 int y=pozy[st];
 
 while( st < dr ){ 
   while( st < dr && pozx[dr] >= x )--dr;
   
    pozx[st]=pozx[dr];
    pozy[st]=pozy[dr];
    
   while( st < dr && pozx[st] <= x )++st;
      
    pozx[dr]=pozx[st];
    pozy[dr]=pozy[st];
            
    }
pozx[st]=x;        
pozy[st]=y;        

        return st;}       
        
 void slowsort(int st,int dr)
 {               
 if(st<dr)
  {
int m=schimb(st,dr);
  slowsort(st,m);
  slowsort(m+1,dr);        
  }     
        }


int main()
{
 freopen("wanted.in","r",stdin);
 freopen("wanted.out","w",stdout);
 
 int n,i,j,dim,k;
    
 scanf("%d",&n);

 for( i=1; i<=n; ++i)
 scanf("%d %d",&pozx[i],&pozy[i]);
 slowsort(1,n); 
     
 
 for(i=1; i<=n; ++i){
 a[i][i]=pozy[i];
 b[i][i]=pozy[i];
 }
  
 int aux,aux1,aux2;
   
   for( dim=1; dim<=n; ++dim)
 {
  
   for(i=1,j=dim+1; i<=n && i+dim<=n; ++i,++j)
      {
        
         for(k=i; k<=j; ++k)
         {
             if(i==k)
             aux1=0;
             else
             aux1=pozx[k]-pozx[k-1];
             
             if(j==k)
             aux2=0;
             else
             aux2=pozx[k+1]-pozx[k];
             
            aux=max(b[i][k-1]+aux1,a[k+1][j]+aux2);   
            
            a[i][j]=min(a[i][j],pozx[k]-pozx[i]+2*pozy[k]+aux);
            b[i][j]=min(b[i][j],pozx[j]-pozx[k]+2*pozy[k]+aux);
            
         }  
      }
   }
   
 int sol=0;
 i=1;
 j=n;
   
   for(k=1; k<=n; ++k)
{
             if(i==k)
             aux1=0;
             else
             aux1=pozx[k]-pozx[k-1];
             
             if(j==k)
             aux2=0;
             else
             aux2=pozx[k+1]-pozx[k];
           
            aux=max(b[i][k-1]+aux1,a[k+1][j]+aux2);
            
      sol=min(sol,abs(pozx[k])+2*pozy[k]+aux);

}  

   printf("%d\n",sol);
    
    return 0;
}