Cod sursa(job #125366)

Utilizator vlad_popaVlad Popa vlad_popa Data 20 ianuarie 2008 12:41:22
Problema Inundatii Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 1.3 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;
}

int findMin (int A[])
{
    int pow, x, s1, s2, i, cnt;
    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 += modul (A[i] - (x + pow + cnt));
        for (i = 1, cnt = 0; i <= N; ++ i, ++ cnt)
            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 += modul (A[i] - (x + pow + cnt + 1));
        
    return s1;
}

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

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