Cod sursa(job #124913)

Utilizator diac_paulPaul Diac diac_paul Data 20 ianuarie 2008 10:09:28
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#define NMax 50001
#define INF 1000000000

int n, c[NMax][3];

void read();
//int trivial(int co);
__int64 sum(int p, int co);
void solve();

int main()
{
	read();
	solve();
	return 0;
}


/*int trivial(int co)
{
	int p, min = INF, s;
	for (p = 0; p < 100; p++)
	{
		s = sum(p, co);
		if (s < min)
			min = s;
		printf("%d %d\n", p, s);
	}
	return min;
}*/

__int64 sum(int p, int co)
{
	int i;
	__int64 s = 0;
	for (i = 0; i < n; i++)
	{
		if (p + i > c[i][co])
			s += p + i - c[i][co];
		else
			s -= p + i - c[i][co];
	}
	return s;
}

void solve()
{
	int co, p, low, high, med;
	__int64 cost, min;
	for (co = 0; co < 3; co++)
	{
		min = INF;
		min *= 1000;
		min *= 1000;
		low = 0;
		high = 100000000;

		while (high - low > 2)
		{
			med = (high + low) / 2;

			if (sum(med, co) >= sum(med + 1, co))
				low = med;
			else
				high = med;
		}

		for (p = med - 5; p <= med + 5; p++)
			if (sum(p, co) < min)
				min = sum(p, co);

		cost += min;
	}

	FILE *fout = fopen("inundatii.out", "wt");
	fprintf(fout, "%I64d\n", cost);
	fclose(fout);
}

void read()
{
	int i;
	FILE *fin = fopen("inundatii.in", "rt");
	fscanf(fin, "%d", &n);
	for (i = 0; i < n; i++)
		fscanf(fin, "%d %d %d", &c[i][0], &c[i][1], &c[i][2]);
	fclose(fin);
}