Cod sursa(job #287417)

Utilizator AnDrEwBoYA Andrei AnDrEwBoY Data 24 martie 2009 20:57:28
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <stdio.h>  
#define FIN "elimin.in"  
#define FOUT "elimin.out"  
#define N_MAX 8000  
#define swap(a,b) a^=b^=a^=b  
#define N_MIN 20  

int N,M,R,C;  
int a[N_MIN][N_MAX];  
int X[N_MAX];  
int Y[N_MIN];  
int s1[N_MIN];  
int sl[N_MIN],sc[N_MAX];  
int SUMA=0,s,S=0;  

 
void quicksort(int li, int ls)  
{  
 int i,j,mij,aux;  
   
 i=li;  
 j=ls;  
 mij=X[li+(ls-li)/2];  
   
 do  
   {  
    while (X[i]<mij) ++i;  
    while (X[j]>mij) --j;  
    if (i<=j)  
       {  
        aux = X[i];  
        X[i] = X[j];  
        X[j] = aux;  
        ++i;  
        --j;  
        }  
 }  
 while (i<=j);  
 if (li<j) quicksort(li,j);  
 if (i<ls) quicksort(i,ls);  
 }  

  
void back(int k)  
{     
 int i,j;  
 if (k == R+1)  
 {  
    for (i=1;i<=N;++i) 
    {  
        X[i] = sc[i];  
        for (j = 1;j <= M;++j)   
          if (Y[j])  
            X[i]-=a[j][i];  
    }   

    
    quicksort(1,N);  
    //sort(X+1,X+N+1);  
    s = S;  
    for(i=1;i<=C;++i)   
       s-=X[i];  
 
    if (s>SUMA)  
        SUMA=s;  
 }  
 else  
 {  
   for (int l = s1[k-1]+1; l <= M; ++l)  
     if (!Y[l])  
     {  
         s1[k] = l;  
         Y[l] = 1;  
         S -= sl[l];  
         back(k+1);  
         Y[l] = 0;  
         S += sl[l];  
     }    
 }  
}  


 void read()  
{  
   
 int i,j;  

 freopen(FIN,"rt",stdin);  
 freopen(FOUT,"wt",stdout);  
   
 scanf("%d %d %d %d", &M, &N, &R, &C);  
  
 if (M<N)  
 {  
   for (i=1;i<=M;++i)   
     for (j=1;j<=N;++j)  
     {  
         scanf("%d ", &a[i][j]);  
         S += a[i][j];  
         sl[i] += a[i][j];  
         sc[j] += a[i][j];  
     }   
 }  
 else  
 {  
   for (i=1;i<=M;++i)    
     for (j=1;j<=N;++j)  
     {  
        scanf("%d ", &a[N-j+1][i]);  
        S+=a[N-j+1][i];  
        sl[N-j+1]+=a[N-j+1][i];  
        sc[i]+=a[N-j+1][i];  
     }  
   swap(M,N);  
   swap(C,R);  
  }  
 }  


int main()  
{  
  read();  
  back(1);  
  printf("%d", SUMA);  
  return 0;  
}