Cod sursa(job #1409162)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 30 martie 2015 13:50:11
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <set>
#include <algorithm>

#define Nmax 4000
#define Mmax 20

using namespace std;

int n , m , l , c , i , j , I , J;
int A[Nmax][Mmax] , sum[Nmax];
set < int > S;

int solve()
{
    int i , j , nr , summ , f;
    for (int x = 0; x < (1 << m); ++x)
    {
        for (nr = 0 , j = 0; j < m; ++j)
         nr += (x >> j & 1);

        if (nr != c) continue;

        for (f = 0 , j = 0; j < m; ++j)
         if (x >> j & 1);
         else
         {
             for (f = f + 1 , i = 1; i <= n; ++i)
              sum[i] = sum[i] * (f != 1) + A[i][j+1];
         }

        sort(sum + 1 , sum + n + 1);

        for (summ = 0 , i = l + 1; i <= n; ++i)
         summ += sum[i];

        S.insert((-1) * summ);
    }

    return (*S.begin() * (-1));
}

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

    scanf("%d %d %d %d", &n, &m, &l, &c);

    for (i = 1; i <= n; ++i)
     for (j = 1; j <= m; ++j)
    {
        if (n < m) I = j , J = i; else I = i , J = j;
        scanf("%d", &A[I][J]);
    }

    if (n < m) swap(n , m) , swap(l , c);

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

    return 0;
}