Cod sursa(job #7636)

Utilizator zombie_testeala bala portocala si mandarina zombie_teste Data 21 ianuarie 2007 20:39:47
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <string.h>
#define MIN(x,y) ( (x) < (y) ? (x) : (y) )
#define MAX(x,y) ( (x) > (y) ? (x) : (y) )
#define NMAX 1001

int A[NMAX][18], Cc[32001], B[NMAX], V[NMAX];
int i, j, N, M, R, C, ii, S, Sum, cnt, K, Max, sc, aux;

int bit_p(int b, int poz)
{
     if (b & 1<<poz) return 1;

     return 0;
}


int afla_sc(int V[], int L, int X)
{
     int i, ss = 0, VM = 0;

     memset(Cc, 0, sizeof(Cc));

     for (i = 1; i <= L; i++) Cc[V[i]]++, VM = MAX(VM, V[i]);

     for (i = 1; i <= VM; i++) Cc[i] += Cc[i-1];

     for (i = 1; i <= L; i++)
     {
          B[ Cc[V[i]] ] = V[i];
          Cc[V[i]] --;
     }

     for (i = 1; i <= X; i++)  ss += B[i];

     return ss;
}

int main()
{
     freopen("elimin.in", "r", stdin);
     freopen("elimin.out", "w", stdout);

     scanf("%d %d %d %d", &N, &M, &R, &C);

     if (N >= M)
     {
          for (i = 0; i < N; i++)
              for (j = 0; j < M; j++) scanf("%d", &A[i][j]);
     }
     else
     {
          for (i = 0; i < N; i++)
              for (j = 0; j < M; j++) scanf("%d", &A[j][i]);

          aux = N; N = M; M = aux;
          aux = R; R = C; C = aux;
     }

          for (i = 0; i < (1 << M); i++)
          {
               cnt = 0;

               for (j = 0; j < M; j++) if (bit_p(i, j)) cnt++;

               if (cnt == C)
               {
                    S = K = 0;

                    for (ii = 0; ii < N; ii++)
                    {
                        Sum = 0;

                        for (j = 0; j < M; j++)
                              if ( bit_p(i, j) == 0 ) Sum += A[ii][j];

                        V[++K] = Sum;

                        S += Sum;
                    }

                    sc = afla_sc(V, K, R);

                    Max = MAX(Max, S - sc);
               }
          }

          printf("%d\n", Max);

     return 0;
}