Cod sursa(job #133476)

Utilizator katakunaCazacu Alexandru katakuna Data 8 februarie 2008 18:45:49
Problema Elimin Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<stdio.h>
long int ok,sum[522],sum2[522],s2,k,su,v[16],max,i,j,x,aux,n,m,l,c,a[522][16];

void cre(long int *v, long int n){
  long int i,aux,c,p;
  for (i=2;i<=n;i++) {
//introduc v[i] in heap
    c = i;
    p = i>>1;
    while ((p)&&(v[c]>v[p])) {
      aux = v[c];
      v[c] = v[p];
      v[p] = aux;
      c = p;
      p = p>>1;
    }
  }
}


void corect(long int poz, long int *v, long int n){
  long int aux,p,c;

  p = poz;
  c = p<<1;
  while (c<=n) {
    if ((c+1<=n) && (v[c+1]>v[c]))
      c++;
    if (v[c]>v[p]) {
      aux = v[c];
      v[c] = v[p];
      v[p] = aux;
      p = c;
      c = p<<1;
    } else break;
  }

}

void s(long int *v, long int n) {
  long int i,aux,p,c;
  cre(v,n);
  for (i=n;i>1;i--) {
    aux = v[1];
    v[1] = v[i];
    v[i] = aux;
    corect(1,v,i-1);
  }
}



int main(){

FILE *f=fopen("elimin.in","r");
fscanf(f,"%ld %ld %ld %ld",&n,&m,&l,&c);

max=-32001;

 if(n>=m){

    for(i=1;i<=n;i++){
      for(j=1;j<=m;j++){
      fscanf(f,"%d",&a[i][j]);
      su+=a[i][j];
      sum[i]+=a[i][j];
      }
    }

 }


 else{

   for(i=1;i<=n;i++){

     for(j=m;j>=1;j--){
     fscanf(f,"%d",&a[j][i]);
     su+=a[j][i];
     sum[i]+=a[i][j];
     }
   }

  aux=n; n=m; m=aux;
  aux=c; c=l; l=aux;

 }



 for(i=0;i<=(1<<m)-1;i++){

  for(j=m-1;j>=0;j--){
  v[j+1]=(i>>j)&1;
  }

  x=0;
  for(j=1;j<=m;j++){
  if(v[j]==1)x++;
  }

    if(x==c){
    s2=su;


     for(j=1;j<=n;j++){
     sum2[j]=sum[j];
     }


    for(j=1;j<=m;j++){

      if(v[j]==1){

	 for(k=1;k<=n;k++){
	 s2-=a[k][j];
	 sum2[k]-=a[k][j];
	 }

      }

    }


      s(sum2,n);


      for(k=1;k<=l;k++){
      s2-=sum2[k];
      }




    if(s2>max)max=s2;

    }


 }



fclose(f);

FILE *g=fopen("elimin.out","w");
fprintf(g,"%ld",max);
fclose(g);

return 0;
}