Cod sursa(job #147166)

Utilizator katakunaCazacu Alexandru katakuna Data 2 martie 2008 17:23:45
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.28 kb
#include<stdio.h>
short 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];         
      }         
    }         
        
 }         

        
 else{         
        
   for(i=1;i<=n;i++){         
        
     for(j=m;j>=1;j--){         
     fscanf(f,"%d",&a[j][i]);         
     su+=a[j][i];         
     }         
   }         
        
  aux=n; n=m; m=aux;         
  aux=c; c=l; l=aux;         
        
 }         
        
        
 for(j=1;j<=n;j++){         
    for(k=1;k<=m;k++){         
    sum[j]+=a[j][k];         
    }         
      }         
        
        
        
 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;         
}      
#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,"%d %d %d %d",&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];
      }
    }

 }


 else{

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

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

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

 }


 for(j=1;j<=n;j++){
    for(k=1;k<=m;k++){
    sum[j]+=a[j][k];
    }
      }



 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,"%d",max);
fclose(g);

return 0;
}