Cod sursa(job #1002453)

Utilizator robert_stefanRobert Stefan robert_stefan Data 27 septembrie 2013 19:56:02
Problema Elimin Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define IN "elimin.in"
#define OUT "elimin.out"

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int r, c, sol[7300], a[7300][7300], sc[7300], sl[7300], sumtot, sc2[7300], mx, soll, n, m;

inline void write()
{
	//out<<'\n';
	out<<mx<<'\n';
}

inline void read()
{
	in>>n>>m>>r>>c;
	int i, j;
	if(n<=m)
		for(i=1; i<=n; ++i)
			for(j=1; j<=m; ++j)
				in>>a[i][j];
	else
	{
		for(i=1; i<=n; ++i)
			for(j=1; j<=m; ++j)
				in>>a[j][i];
		swap(n,m);
		swap(r,c);
	}
	for(i=1; i<=n; ++i)
		for(j=1; j<=m; ++j)
		{
			sl[i]+=a[i][j];
		    sc[j]+=a[i][j];
			sumtot+=a[i][j];
        }
}

inline void greedy()
{
	sort(sc2+1, sc2+m+1);
	int i=1;
	for(; i<=c; ++i)
		soll-=sc2[i];
	if(soll>mx)
		mx=soll;
}

inline void solution()
{
	int i=1, j=1;
	soll=sumtot;
	
	for(; i<=m; ++i)
		sc2[i]=sc[i];
	for(i=1; i<=r; ++i)
	{
		for(; j<=m; ++j)
			sc2[j]-=a[sol[i]][j];
		soll-=sl[sol[i]];
	}
	if(c)
	{
		greedy();
	}
}

inline void tiparestesol(int lim)
{
	for(int i=1; i<=lim; ++i)
		out<<sol[i]<<' ';
	out<<'\n';
}

inline void BT(int k)//combinari de n luate cate r
{
	if(k==r+1)
		solution();
	else
	{
		sol[k]=sol[k-1];
		while(sol[k]<n)
		{
			++sol[k];
			BT(k+1);
		}
	}
}

int main()
{
	read();
	BT(1);
	write();
	in.close();
	out.close();
	return 0;
}