Cod sursa(job #133464)

Utilizator katakunaCazacu Alexandru katakuna Data 8 februarie 2008 18:35:16
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 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];   
      }   
    }   
  
 }   
  
  
 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;   
}