Cod sursa(job #1541883)

Utilizator dnprxDan Pracsiu dnprx Data 4 decembrie 2015 17:39:14
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;

int suma_matrice, s_linie[7300], s_coloana[20];
int n, m, r, c, a[7300][20];
int suma_coloane, suma_linii;

void Citire()
{
    int i, j;
    ifstream fin("elimin.in");
    fin >> n >> m >> r >> c;
    if(n > m)
    {
        for(i = 1; i <= n; i++)
           for(j = 1; j <= m; j++)
              fin >> a[i][j];
    }
    else
    {
         for(i = 1; i <= n; i++)
           for(j = 1; j <= m; j++)
                fin >> a[j][i];
         swap(n, m);
         swap(r, c);
    }
    fin.close();
}

void Precalculari()
{
    int i, j;
    suma_matrice = 0;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m; j++)
        {
            suma_matrice += a[i][j];
            s_coloana[j] += a[i][j];
        }
}

void Generare()
{
    int q, nr, nr_col, sol = 0, i, j;
    nr = (1 << m);
    for(q = 0; q < nr; q++)
    {
        nr_col=0;
        for(j = 0; j < m; j++)
           if(q & (1<<j)) nr_col++;

        if(nr_col == c)
        {
            suma_coloane = 0; suma_linii = 0;
            for(i = 1; i <= n; i++) s_linie[i] = 0;

            for(i = 1; i <= n; i++)
                for(j = 1; j <= m; j++)
                    if(q & (1 << (j - 1))) suma_coloane += a[i][j];
                    else s_linie[i] += a[i][j];

            sort(s_linie + 1, s_linie + n + 1);
            for(i = 1; i <= r; i++) suma_linii += s_linie[i];

            if(suma_matrice - suma_coloane - suma_linii > sol)
                sol = suma_matrice - suma_coloane - suma_linii;
        }
    }

    ofstream fout("elimin.out");
    fout<< sol << "\n";
    fout.close();
}

int main()
{
    Citire();
    Precalculari();
    Generare();
    return 0;
}