Cod sursa(job #1064503)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 21 decembrie 2013 23:01:03
Problema Elimin Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.31 kb
#include <fstream>
#include <algorithm>
#include <cstring>

#define In "elimin.in"
#define Out "elimin.out"

using namespace std;
short v[20],a[20][8000],b[8000][20], n, m, l ,c;
int sol;
inline void Read()
{
    int i, j;
    ifstream f(In);
    f>> n >> m >> l >> c;
    if(n <= m)
    {
        for(i = 1;i <= n; ++i)
            for(j = 1 ;j <= m; ++j)
                f>>a[i][j];
    }
    else
    {
        for(i = 1;i <= n; ++i)
            for(j = 1 ;j <= m; ++j)
                f>>b[i][j];
        for(i = 1;i <= n; ++i)
            for(j = 1;j <= m; ++j)
                a[j][i] = b[i][j];
        swap(n,m);
        swap(l,c);
    }
}

inline void Solve()
{
    int i,sum = 0,j ,k = 1;
    int s[8000];
    memset(s,0,sizeof(s));
    for(i = 1;i <= n; ++i)
        if(k <= l && i == v[k])
            ++k;
        else
        {
            for(j = 1;j <= m; ++j)
                s[j] += a[i][j];
        }
    sort(s+1,s+m+1);
    for(i = c+1; i<= m; ++i)
        sum += s[i];
    sol = max(sol,sum);
}

inline void Back(const int k)
{
    if(k==l+1)
    {
        Solve();
        return ;
    }
    for(int i=v[k-1]+1;i <= n;++i)
    {
        v[k] = i;
        Back(k+1);
    }
}

inline void Write()
{
    ofstream g(Out);
    g<<sol<<"\n";
    g.close();
}

int main()
{
    Read();
    Back(1);
    Write();
    return 0;
}