Cod sursa(job #3125957)

Utilizator daristyleBejan Darius-Ramon daristyle Data 4 mai 2023 21:30:02
Problema Elimin Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <algorithm>

using namespace std;
ifstream fin("elimin.in");
ofstream fout("elimin.out");

struct parcurgere {
		int b;
		int e;
		int pas;
};
const int N_MAX = 15;
const int M_MAX = 7294;
short m[N_MAX][M_MAX];
int sum[M_MAX];
parcurgere row, column;

int main() {
	int rows, columns, rowselim, columnselim;
	fin >> rows >> columns >> rowselim >> columnselim;
	row.b = 0;
	row.e = rows;
	row.pas = 1;
	column.b = 0;
	column.e = columns;
	column.pas = 1;
	if(rows <= N_MAX)
		for(int r = 0; r < rows; ++r)
			for(int c = 0; c < columns; ++c)
				fin >> m[r][c];
	else{
		for(int r = 0; r < rows; ++r)
			for(int c = columns - 1; c >= 0; --c)
				fin >> m[c][r];

		row.b = columns - 1;
		row.e = -1;
		row.pas = -1;
		column.e = rows;

		swap(rows, columns);
	}

	int summax = 0, sumtotal;
	for(int i = 0; i < (1 << rows); ++i)
		if(__builtin_popcount(i) == rowselim){
			for(int c = column.b; c != column.e; c += column.pas)
				sum[c] = 0;

			for(int r = row.b; r != row.e; r += row.pas)
				if(!(i & (1 << r)))
					for(int c = column.b; c != column.e; c += column.pas)
						sum[c] += m[r][c];

			sort(sum, sum + abs(column.e - column.b));

			sumtotal = 0;
			for(int j = columnselim; j < abs(column.e - column.b); ++j)
				sumtotal += sum[j];

			if(sumtotal > summax)
				summax = sumtotal;
		}

	fout << summax << '\n';

	fin.close();
	fout.close();
	return 0;
}