Cod sursa(job #125483)

Utilizator vlad_popaVlad Popa vlad_popa Data 20 ianuarie 2008 12:59:47
Problema Inundatii Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.42 kb
#include <cstdio>

#define NMAX 50001

int N;
int x[NMAX], y[NMAX], z[NMAX];

void read ()
{
    scanf ("%d\n", &N);
    
    int i;
    for (i = 1; i <= N; ++ i)
        scanf ("%d %d %d\n", x + i, y + i, z + i);
}

inline int modul (int x)
{
    return x > 0 ? x : -x;
}

long long findMin (int A[])
{
    int pow, i, cnt, x;
    long long s1, s2;
    for (pow = 1; pow < 100000000; pow <<= 1);
    
    for (x = 0; pow; pow >>= 1)
    {
        s1 = s2 = 0;
        for (i = 1, cnt = 0; i <= N; ++ i, ++ cnt)
            s1 = (long long)(s1 + modul (A[i] - (x + pow + cnt)));
        for (i = 1, cnt = 0; i <= N; ++ i, ++ cnt)
            s2 = (long long)(s2 + modul (A[i] - (x + pow + cnt + 1)));
        
        //printf ("%d %d\n", s1, s2);
        if (s1 >= s2)
            x += pow;
    }
    //printf ("%d\n", x);
    s1 = 0;
    for (i = 1, cnt = 0; i <= N; ++ i, ++ cnt)
        s1 = (long long)(s1 + modul (A[i] - (x + pow + cnt + 1)));
        
    return s1;
}

void solve ()
{
    long long sol;
    
    sol = (long long)(findMin (x));
    //printf ("%d\n", sol);
    sol = (long long)(sol + findMin (y));
    //printf ("%d\n", sol);
    sol = (long long)(sol + findMin (z));
    
    printf ("%lld\n", sol);
}

int
 main ()
{
    freopen ("inundatii.in", "rt", stdin);
    freopen ("inundatii.out", "wt", stdout);
    
    read ();
    solve ();
    
    return 0;
}