Cod sursa(job #125077)

Utilizator stef2nStefan Istrate stef2n Data 20 ianuarie 2008 11:15:35
Problema Inundatii Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 1.08 kb
//#define DEBUG

#include <cstdio>
#ifdef DEBUG
#include <iostream>
using namespace std;
#endif

#define NMAX 50005
struct cladire
{
    int x, y, z;
};

int N;
cladire B[NMAX];
long long sol;

long long distanta(cladire A, cladire B)
{
    return A.x-B.x + A.y-B.y + A.z-B.z;
}

void solve()
{
    long long cost_transport=0, value;
    for(int i=1; i<N; ++i)
        cost_transport += distanta(B[i], B[0]);
    sol = cost_transport + 3*(long long)N*(N-1)/2;
#ifdef DEBUG
    cerr<<sol<<" ";
#endif
    for(int i=1; i<N; ++i)
    {
        cost_transport -= (long long)(N-i)*distanta(B[i], B[i-1]);
        cost_transport += (long long)i*distanta(B[i], B[i-1]);
        value = cost_transport + 3*(long long)i*(i+1)/2 + 3*(long long)(N-i-1)*(N-i)/2;
#ifdef DEBUG
        cerr<<value<<" ";
#endif
        if(sol>value)
            sol=value;
    }
}


int main()
{
    freopen("inundatii.in", "r", stdin);
    freopen("inundatii.out", "w", stdout);
    scanf("%d", &N);
    for(int i=N-1; i>=0; --i)
        scanf("%d %d %d", &B[i].x, &B[i].y, &B[i].z);
    solve();
    printf("%Ld\n", sol);
    return 0;
}