Cod sursa(job #189068)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 11 mai 2008 19:51:22
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include <algorithm>
#define Nmax 522
using namespace std;
long long bestS,Suma;
int v[Nmax];
int m,n,c,r;
int a[Nmax][Nmax];
int sol[20];
char cit[10000],*s;  
void scan()
{
	freopen("elimin.in", "r", stdin);
	freopen("elimin.out", "w", stdout);
	scanf("%d%d%d%d\n", &m,&n,&r,&c);
}	
void makeS()
{
	long long Si=Suma;
	for(int i=1;i<=m;++i)
		v[i]=a[i][0];
	for(int i=1;i<=c;++i)
	{
		Si-=a[0][sol[i]];
		for(int j=1;j<=m;++j)
			v[j]-=a[j][sol[i]];
	}
	sort(v+1,v+m+1); 
	for(int i=1;i<=r;++i)
		Si-=v[i];
	if(Si>bestS)
		bestS=Si;
}
void back(int x)
{
	if(x==c)
		makeS();
	else
		for(int i=sol[x]+1;i<=n;++i)
		{
			sol[x+1]=i;
			back(x+1);
		}	
}		
void solve()
{
	if(m<n)
	{  
        int aux;
		aux=r; r=c; c=aux; 
		for(int i=1;i<=m;++i)
		{
			s=0;
			gets(cit);
			s=cit;  
			for(int j=1;j<=n;++j)
			{
				a[j][m+1-i]=atol(s);
				s=strchr(s,' ');  
				s++; 
				Suma+=a[j][m+1-i];
				a[j][0]+=a[j][m+1-i];
				a[0][m+1-i]+=a[j][m+1-i];
			}
		}	
		aux=n; n=m; m=aux;  	
    }  
    else
	{  
        for(int i=1;i<=m;++i)
		{
			s=0;
			gets(cit);
			s=cit;  
			for(int j=1;j<=n;++j)
			{
				a[i][j]=atol(s);
				s=strchr(s,' ');    
				s++; 
				Suma+=a[i][j];
				a[i][0]+=a[i][j];
				a[0][j]+=a[i][j];
			}
		}	
    }  
	back(0);
	printf("%lld\n",bestS);
}	
int main()
{
	scan();
	solve();
	return 0;
}