Cod sursa(job #147168)

Utilizator katakunaCazacu Alexandru katakuna Data 2 martie 2008 17:26:04
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 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(short *v, short 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(short poz,short *v, short 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(short *v, short 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;         
}