Cod sursa(job #1635031)

Utilizator musashi1Doros Doru-Lucian musashi1 Data 6 martie 2016 14:52:39
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <fstream>
using namespace std;
ifstream fin("elimin.in");
ofstream fout("elimin.out");
int main()
{
	static int c[7300][7300], sum, ran,tot=0, col, difc, m[7300][7300], b[7300][7300], mxi, mxj, maxi, maxj, max, n1, n2, c1, c2, nrc;
	fin >> n1 >> n2 >> c1 >> c2;
	difc = c1 - c2;
	if (difc<0)
	{
		nrc = 2;
		difc = -difc;
	}
	else nrc = 1;
	for (int i = 1; i <= n1; i++)
	{
		for (int j = 1; j <= n2; j++)
		{
			fin >> m[i][j];
			m[0][j] += m[i][j];
			m[i][0] += m[i][j];
			tot += m[i][j];
		}
	}
	max = m[0][1] + m[1][0] - m[1][1];
	for (int i = 1; i <= n1; i++)
	{
		for (int j = 1; j <= n2; j++)
		{
			b[i][j] = m[0][j] + m[i][0] - m[i][j];
			if (b[i][j]<max)
			{
				max = b[i][j];
				maxi = i;
				maxj = j;
			}
		}
	}
	ran = maxi;
	col = maxj;
	sum = max;
	for (int i = 1; i <= n1; i++)
	{
		c[i][maxj] += 1;
	}
	for (int i = 1; i <= n2; i++)
	{
		c[maxi][i] += 1;
	}
	for (int k = 1; k <= difc; k++)
	{

		for (int i = 1; i <= n1; i++)
		{
			for (int j = 1; j <= n2; j++)
			{
				if (c[i][j] == 0)
				{

					b[i][j] -= (m[maxi][j] + m[i][maxj]);
					if (b[i][j]<max)
					{
						max = b[i][j];
						mxi = i;
						mxj = j;
					}
				}
			}
		}
		maxi = mxi;
		maxj = mxj;

		for (int i = 1; i <= n1; i++)
		{
			c[i][maxj] += 1;
			m[i][0] -= m[i][maxj];

		}
		for (int i = 1; i <= n2; i++)
		{
			c[maxi][i] += 1;
			m[0][i] -= m[maxi][i];
		}
		sum += max;
		max = 233600000;
	}





	if (c1>c2)
	{
		for (int k = c2; k <= c1; k++)
		for (int i = 1; i <= n1; i++)
		{
			for (int j = 1; j <= n2; j++)
			{
				if (c[i][j] == 1)
				{
					b[i][j] = m[0][j] - m[i][j];
					if (b[i][j]<max)
					{
						max = b[i][j];
						mxi = i;
						mxj = j;
					}
				}
			}
		}
		maxi = mxi;
		maxj = mxj;
		sum += max;
		max = 233600000;
		for (int i = 1; i <= n1; i++)
		{
			c[i][maxj] += 1;
			m[i][0] -= m[i][maxj];
		}
	}
	if (c1<c2)
	{
		for (int k = c1; k <= c2; k++)
		for (int i = 1; i <= n1; i++)
		{
			for (int j = 1; j <= n2; j++)
			{
				if (c[i][j] == 1)
				{
					b[i][j] = m[i][0] - m[i][j];
					if (b[i][j]<max)
					{
						max = b[i][j];
						mxi = i;
						mxj = j;
					}
				}
			}
		}
		maxi = mxi;
		maxj = mxj;
		sum += max;
		max = 233600000;
		for (int i = 1; i <= n2; i++)
		{
			c[i][maxj] += 1;
			m[0][i] -= m[maxi][i];
		}
	}
	fout << tot-sum;





}