Cod sursa(job #25391)

Utilizator DorinOltean Dorin Dorin Data 4 martie 2007 12:25:36
Problema Magazin Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 3.79 kb
#include <stdio.h>

#define input "magazin.in"
#define output "magazin.out"
#define dimmax 310
#define infinit 30000

struct produse
{
    int x,y;
}sir[dimmax];    

struct rezultat
{
    int x,y,cost;
}rez[dimmax*dimmax];
    
int p,n,m,d,t,k,a[dimmax][dimmax],aux[dimmax],suma;
int minim(int x,int y);
void qsort(int ls,int ld);
void poz(int ls,int ld);

int main()
{
        freopen(input,"r",stdin);
        freopen(output,"w",stdout);
        int i,j,dist,min,poz;
        scanf("%d%d%d%d",&p,&n,&m,&d);
        for(i=1;i<=p;i++)
        {
          scanf("%d%d",&sir[i].x,&sir[i].y);
          a[0][i]=a[i][0]=(sir[i].x-1)*d+sir[i].y;
          a[p+1][i]=a[i][p+1]=(n-sir[i].x)*d+sir[i].y;
        }
        a[0][0]=a[p+1][p+1]=a[0][p+1]=a[p+1][0]=infinit;
        
        //calculez distantzele
        for(i=1;i<=p;i++)
           for(j=1;j<=p;j++)
              if(i!=j)
              {
                if(sir[i].x==sir[j].x)// is pe acelasi rand
                {
                   a[i][j]=a[j][i]=sir[i].y-sir[j].y;
                   if(a[i][j]<0)
                     a[i][j]=a[j][i]=-a[i][j]; 
                }        
                else
                {
                   dist=sir[i].x-sir[j].x; 
                   if(dist<0)
                     dist=-dist;
                   a[i][j]=a[j][i]=dist*d + minim(sir[i].y+sir[j].y,2*m-(sir[i].y+sir[j].y)+2);    
                }
              }
              else
                a[i][j]=a[j][i]=infinit;        
        //pun distantzele in sir ca sa pot face qsort                      
        
        k=0;
        for(i=0;i<=p+1;i++)
          for(j=0;j<=p+1;j++)
          {
             ++k; 
             rez[k].cost=a[i][j];
             rez[k].x=i;
             rez[k].y=j;
         }
        t=k; 
        //qsort
        //qsort(1,t);
        
        //aflu drumu
/*        k=0;
        for(i=1;i<=t&&k<p+2;i++)
          if(aux[rez[i].x]==0||aux[rez[i].y]==0)
          {
             suma+=rez[i].cost;
             k+=(2-aux[rez[i].x]-aux[rez[i].y]);
             aux[rez[i].x]=aux[rez[i].y]=1;
          }    
        printf("%d",suma);
        //afisez ce draq am acolo    
        printf("\n");      
        for(i=0;i<=p+1;i++)
        {
          for(j=0;j<=p+1;j++)
           printf("%d ",a[i][j]);
          printf("\n");
        }

/*        for(i=1;i<=t;i++)
           printf("%d %d-%d\n",rez[i].cost,rez[i].x,rez[i].y);
*/
        k=0;
        aux[0]=1;
        for(i=0;i<=p;i++)
        {
//            printf("%d ",k);
           min=30000;
           if(i<p)
           {
           for(j=0;j<=p;j++)
              if(a[k][j]<min&&aux[j]==0)
              {
                 min=a[k][j];
                 poz=j;
              }     
           }
           else    
           {
           for(j=0;j<=p+1;j++)
              if(a[k][j]<min&&aux[j]==0)
              {
                 min=a[k][j];
                 poz=j;
              }     
           }

           suma+=min;   
           aux[poz]=1;
           k=poz;
        }    
        printf("%d",suma);
                            
        
        return 0;
}    

int minim(int x,int y)
{
    if(x<=y)
      return x;        
    else
      return y;
}    
void qsort(int ls,int ld)
{
    if(ls<ld)
    {
        poz(ls,ld);
        qsort(ls,k-1);
        qsort(k+1,ld);
    }
}        
void poz(int ls,int ld)
{
    int i=ls,j=ld,i0=0,j0=-1,aux0;
    rezultat aux;
    while(i<j)
    {
        if(rez[i].cost>rez[j].cost)
        {
          aux=rez[i];
          rez[i]=rez[j];
          rez[j]=aux;
          
          aux0=i0;
          i0=-j0;
          j0=-aux0;
        }      
        
        i+=i0;
        j+=j0;
    }
    k=i;
}