Cod sursa(job #125445)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 20 ianuarie 2008 12:53:23
Problema Inundatii Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.1 kb
#include <stdio.h>
#include <string.h>
const int n_max = 50001;
int x[n_max],
    y[n_max],
    z[n_max],
    x1[n_max],
    y1[n_max],
    z1[n_max];

int  i, n;
long long sol, minim;
int abs(int x)
{
	if (x < 0)
		return -x;
	return x;
}
int main()
{
	freopen("inundatii.in","r",stdin);
	freopen("inundatii.out","w",stdout);
	scanf("%d", &n);
	for (i =1 ; i <= n; ++ i)
		scanf("%d %d %d", &x[i], &y[i], &z[i]);
	memcpy(x1,x,sizeof(x));
	memcpy(y1,y,sizeof(y));
	memcpy(z1,z,sizeof(z));
	//nim = 1<<30;
	for (i = n; i > 1; --i)
	{
		sol += abs(x1[i]-x1[i-1]) + abs(y1[i] - y1[i-1]) + abs(z1[i] - z1[i-1])+3;
		x1[i-1] = x1[i] + 1;
		y1[i-1] = y1[i] + 1;
		z1[i-1] = z1[i] + 1;
	}
	minim = sol;
	sol = 0;
	memcpy(x1,x,sizeof(x));
	memcpy(y1,y,sizeof(y));
	memcpy(z1,z,sizeof(z));
	for (i = 1; i < n; ++ i)
	{
		sol += abs(x1[i]-x1[i+1]) + abs(y1[i] - y1[i+1]) + abs(z1[i] - z1[i+1])+3;
		x1[i] = (x1[i]+x1[i+1])/2;
		y1[i] = (y1[i]+y1[i+1])/2;
		z1[i] = (z1[i]+z1[i+1])/2;
		x1[i+1] = x1[i] + 1;
		y1[i+1] = y1[i] + 1;
		z1[i+1] = z1[i] + 1;
	}
	if (sol < minim) 
		minim = sol;
	printf("%lld\n", minim);
	return 0;
}