Cod sursa(job #124928)

Utilizator diac_paulPaul Diac diac_paul Data 20 ianuarie 2008 10:18:54
Problema Inundatii Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.33 kb
#include <stdio.h>
#define NMax 50001
#define INF 1000000000

int n, c[NMax][3];

void read();
//int trivial(int co);
long long 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;
}*/

long long sum(int p, int co)
{
	int i;
	long long 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;
	long long cost = 0, 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, "%lld\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);
}