Cod sursa(job #133478)

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