Cod sursa(job #2312285)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 4 ianuarie 2019 16:46:28
Problema Elimin Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

int m, n, r, c, min_dim, max_dim, min_elimin, max_elimin, s, sol_max = -1;
bool min_r;

void elimina(int lung_elimin, int *suma, int suma_cur) {
    sort(suma, suma + max_dim);
    for (int i = 0; i < lung_elimin; i++)
        suma_cur -= suma[i];
    if (suma_cur > sol_max)
        sol_max = suma_cur;
}

int main() {
	freopen("elimin.in", "r", stdin);
	freopen("elimin.out", "w", stdout);
	scanf("%d %d %d %d", &m, &n, &r, &c);
    if (m <= n)
        min_r = 1;
    min_dim = m;
    max_dim = n;
    min_elimin = r;
    max_elimin = c;
    if (m > n) {
        min_dim = n;
        max_dim = m;
        min_elimin = c;
        max_elimin = r;
    }
    int a[min_dim][max_dim];
    int suma_r[min_dim] = {0}, suma_c[max_dim] = {0};
    if (min_r)
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                scanf("%d", &a[i][j]);
                s += a[i][j];
            }
    else
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                scanf("%d", &a[j][i]);
                s += a[j][i];
            }
    for (int i = 0; i < min_dim; i++) {
        for (int j = 0; j < max_dim; j++) {
            suma_r[i] += a[i][j];
            suma_c[j] += a[i][j];
        }
    }
    if (min_r && r == 0) {
        elimina(c, suma_c, s);
        printf("%d", sol_max);
        return 0;
    }
    int lim = 1 << min_dim, bin = 0, mask, nr_biti, suma_partiala;
    int part_c[max_dim];
    while (bin < lim) {
        nr_biti = 0;
        mask = 1;
        while (mask <= bin) {
            if (mask & bin)
                nr_biti++;
            mask <<= 1;
        }
        if (nr_biti == min_elimin) {
            for (int i = 0; i < max_dim; i++)
                part_c[i] = suma_c[i];
            suma_partiala = s;
            for (int i = 0, mask = 1; mask <= bin; i++, mask <<= 1)
                if (mask & bin) {
                    for (int j = 0; j < max_dim; j++)
                        part_c[j] -= a[i][j];
                    suma_partiala -= suma_r[i];
                }
            elimina(max_elimin, part_c, suma_partiala);
        }
        bin++;
    }
    printf("%d", sol_max);
	return 0;
}