Cod sursa(job #1240625)

Utilizator tudi98Cozma Tudor tudi98 Data 11 octombrie 2014 19:44:50
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <algorithm>
using namespace std;


int a[20][4000];
int Sum[20];
bool used[20];
int Col[4000];

int main(){

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

	int n,m,r,c;
	bool swp = false;
	scanf("%d%d%d%d",&n,&m,&r,&c);
	if(n > m){
		swp = true;	
	}
	if(swp){
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				scanf("%d",&a[m-j-1][i]), Sum[m-j-1] += a[m-j-1][i];
			}
		}

		if(swp){
		 	swap(n,m);
		 	swap(r,c);
		}

	}
	else{
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				scanf("%d",&a[i][j]),Sum[i] += a[i][j];
			}
		}

  	}	
            
	int Best = 0;
	int N = 1 << n;
	for(int i = 0; i <= N; i++){
		int R = 0;
		int S = 0;
		int SZ = 0;
		for(int j = 0; j <= 15; j++){
			used[j] = false;
			if(i & (1 << j)){
			      R++;
			      S += Sum[j];
			      used[j] = true;
			}	
		} 
		//printf("%d\n%d\n",S,R);
		if(R == n - r){
			for(int j = 0; j < m; j++){
				int SS = 0;
			 	for(int k = 0; k < n; k++){
			 		if(!used[k]) continue;
			 		SS += a[k][j];
			 	}
			 	Col[++SZ] = SS;
			}
			sort(Col+1,Col+SZ+1);
			for(int k = 1; k <= c; k++)
				S -= Col[k];
			if(S > Best) Best = S;		
		}
	}

	printf("%d\n",Best);
}