Cod sursa(job #1781306)

Utilizator silkMarin Dragos silk Data 16 octombrie 2016 19:54:53
Problema Inundatii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#define NMax 50000
#define ll long long
#define ABS(x)((x)>0?(x):(-(x)))
#define MIN(a,b)((a)<(b)?(a):(b))

int x[3][NMax+1];
int N;

ll cost(int v, int c, int l)
{
    int i,t;
    ll ans = ABS(x[l][c]-v);

    for(t = v-1, i = c-1; i >= 1; --i,--t) ans += ABS(x[l][i]-t);
    for(t = v+1, i = c+1; i <= N; ++i,++t) ans += ABS(x[l][i]-t);

    return ans;
}

ll get_min(int l)
{
    int i;
    ll ans,sum = 0;

    for(i = 1; i <= N; ++i) sum += x[l][i];
    sum = sum/N;

    ans = cost(sum,N/2,l);
    ans = MIN( ans, cost(sum,N/2+1,l) );
    --sum;
    ans = MIN( ans, cost(sum,N/2,l) );
    ans = MIN( ans, cost(sum,N/2+1,l) );
    sum += 2;
    ans = MIN( ans, cost(sum,N/2,l) );
    ans = MIN( ans, cost(sum,N/2+1,l) );

    return ans;
}

int main(){
    freopen("inundatii.in","r",stdin);
    freopen("inundatii.out","w",stdout);

    int i,j;

    scanf("%d",&N);
    for(i = 1; i <= N; ++i)
        for(j = 0; j < 3; ++j) scanf("%d",&x[j][i]);

    printf("%lld\n", get_min(0) + get_min(1) + get_min(2) );



return 0;
}