Cod sursa(job #2339022)

Utilizator skoda888Alexandru Robert skoda888 Data 8 februarie 2019 11:47:57
Problema Elimin Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb


#include <iostream>
#include <fstream>
#include <algorithm>


const int MNMAX = 3700;

int Mat[MNMAX][MNMAX];
int Sum[MNMAX];
int copySum[MNMAX];

int lastOne(int num) {

	return num & -num;
}


int ones(int num) {

	int countR = 0;
	while (num) {
		num -= lastOne(num);
		++countR;
	}

	return countR;
}


void reinit_Sum(int N) {
		
	for (int i = 1; i <= N; ++i) {
		copySum[i] = Sum[i];
	}
}


int main() {

	std::ifstream in("elimin.in");
	std::ofstream out("elimin.out");

	int N, M, R, C;
	in >> N >> M >> R >> C;

	if (M > N) {
		std::swap(M, N);
		std::swap(R, C);
	}

	long long int totalSum = 0;
	for (int i = 1; i <= N; ++i) {
		for (int j = 1; j <= M; ++j) {
			in >> Mat[i][j];
			Sum[i] += Mat[i][j];
		}
		totalSum += Sum[i];
	}

	int pow2 = 1 << N;
	long long int maxTotalSum = -1;
	for (int x = 1; x < pow2; ++x) {
		if (ones(x) == C) {
			for (int c = 0; c < M; ++c) {
				if ((1 << c) & x) {
					reinit_Sum(N);
					long long int copyTotalSum = totalSum;

					for (int r = 1; r <= N; ++r) {
						copySum[r] -= Mat[c + 1][r];
						copyTotalSum -= Mat[c + 1][r];;
					}

					std::sort(copySum + 1, copySum + 1 + N);

					for (int i = 1; i <= R; ++i) {
						copyTotalSum -= copySum[i];
					}

					maxTotalSum = std::max(maxTotalSum, copyTotalSum);

				}
			}
		}
	}

	out << maxTotalSum;

	system("PAUSE");
	return 0;
}