Cod sursa(job #21355)

Utilizator tvladTataranu Vlad tvlad Data 23 februarie 2007 13:10:59
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define dbg if(v1)
bool v1 = false;

const int N = 500;

int n,m,r,c, sg;
int a[N][N];
int sc[N], sl[N], x[N];
int max_my = -2000000000;
struct s_linie {
	int s, p;
};
s_linie y[N];

inline bool comp_s_linie ( const s_linie &a, const s_linie &b ) { return (a.s > b.s); }

void linii() {
	int s = sg;
	for (int i = 0; i<n; ++i) {
		y[i].p = i;
		y[i].s = -sl[i];
		for (int j = 0; j<c; ++j) {
			y[i].s += a[i][x[j]];
		}
		dbg printf("Linia %d scade %d\n",i,y[i].s);
	}
	sort(y,y+n,comp_s_linie);
	for (int i = 0; i<r; ++i) {
		s += y[i].s;
		dbg printf("Aleg linia %d\n",y[i].p);
	}
	dbg printf("iese suma %d\n",s);
	if (s > max_my) {
		max_my = s;
		dbg printf("care este si maxima\n");
	}
}

void back ( int lvl ) {
	for (int i = (lvl == 0) ? 0 : x[lvl-1]+1; i<m; ++i) {
		x[lvl] = i;
		sg -= sc[x[lvl]];
		if (lvl == c-1) {
			dbg printf("O varianta pe coloane: ");
			dbg for (int i = 0; i<=lvl; ++i) {
				printf("%d ",x[i]);
			}
			dbg printf(" ( suma ramane: %d )\n",sg);
			linii();
		} else {
			back(lvl+1);
		}
		sg += sc[x[lvl]];
	}
}

int main() {
	freopen("elimin.in","r",stdin);
	freopen("elimin.out","w",stdout);

	scanf("%d %d %d %d",&n,&m,&r,&c);
	if (n < m) {
		//citesc inversat
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j<m; ++j) {
				scanf("%d",&a[j][i]);
				sg += a[j][i];
				sc[i] += a[j][i];
				sl[j] += a[j][i];
			}
		}
		n ^= m; m ^= n; n ^= m;
		r ^= c; c ^= r; r ^= c;
	} else {
		//citesc normal
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j<m; ++j) {
				scanf("%d",&a[i][j]);
				sg += a[i][j];
				sc[j] += a[i][j];
				sl[i] += a[i][j];
			}
		}
	}
	dbg {
		printf("%d linii si %d coloane\n",n,m);
		for (int i = 0; i<n; ++i) {
			for (int j = 0; j<m; ++j) {
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}
		for (int i = 0; i<n; ++i) {
			printf("suma pe linia %d este %d\n",i,sl[i]);
		}
		for (int j = 0; j<m; ++j) {
			printf("suma pe coloana %d este %d\n",j,sc[j]);
		}
	}
	dbg printf("Intru in back\n");
	back(0);

	printf("%d\n",max_my);
	return 0;
}