Cod sursa(job #57989)

Utilizator RazvanSSavu Razvan RazvanS Data 3 mai 2007 20:38:39
Problema Elimin Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#include <cstring>

#define MAX 600

int M[MAX][MAX];
int m, n, r, c;
int smax;
int V[MAX];
int S[MAX];


void showv( void )
    { int i;
      for(i=1;i<=n;++i)
         printf("%d ", V[i]);
      printf("\n");
    }    



void read ( void )
     {
      freopen("elimin.in", "r", stdin);
      scanf("%d %d %d %d\n", &m, &n, &r, &c);
      int i, j, aux;
      if(n<=15) { for(i=1;i<=m;++i)
                     for(j=1;j<=n;++j)
                          scanf("%d ", &M[i][j]);
                }
                
         else { for(i=1;i<=m;++i)
                   for(j=1;j<=n;++j)
                       scanf("%d ", &M[j][i]);
                 
                aux=m;
                m=n;
                n=aux;
               }
               
     }
     
void sch(int x, int y)
    {int aux;
     aux=S[x], S[x]=S[y];  S[y]=aux;}   
     
int pivot(int p, int q)
    {
     while(p<q) {
                while(p<q && S[p]>=S[q]) p++;
                if(p<q) sch(p, q);
                while(p<q && S[p]>=S[q]) q--;
                if(p<q) sch(p, q);
                }
     
     return p;
     }                  
     
void sort (int p, int q)
     {int k;
      if(p<q) {k=pivot(p, q);
               sort(p, k-1);
               sort(k+1, q);
              }
     }                
     
     
void bkt ( void )
    {
     int P = 1<<n, Q= 1<< (n-1);
     int i, j;
     int nr;
     int s, t, stop;
     for(i=0;i< P; ++i)
         {memset(V, 0, sizeof(V));
          for(j=Q, stop=0, s=0, nr=0, t=1; j!=0; j>>=1, ++t)
             {if(i&j)  {nr++; V[t]=1;}
              if(nr>c || n-t<c-nr) { stop=1; break;}//printf("asasdfasdfsadffsda\n"); break;}
             }
          //showv();                     
          
          if(!stop) {memset(S, 0, sizeof( S ) );//printf("asfsda\n");
                     for(j=1;j<=m;++j) //printf("* %d\n", S[j-1]))
                        for(t=1;t<=n;++t)
                           S[j]+= M[j][t]*(!V[t]);
                           
                     sort(1,m);             //printf("asdfsadfsadfsdafsadfsdfsad\n");
                     for(j=1;j<=m-r;++j)
                         s+=S[j];
                     if(s>smax) smax=s; //printf("%d\n", s);
                     }
          }
     }
          
                       
          
     
int main( void )
        {
         read ();
         freopen("elimin.out", "w", stdout);
         bkt();
         printf("%d\n", smax);
         
         
         
         return 0;
         }