Cod sursa(job #596289)

Utilizator SpiderManSimoiu Robert SpiderMan Data 16 iunie 2011 17:41:50
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
# include <cstdio>
# include <cstring>

# define verf ++poz == hg ? fread ( ch, 1, hg, stdin ), poz = 0 : 0

const char *FIN = "bibel.in", *FOU = "bibel.out";
const int oo = 0x3f3f3f3f, hg = 1 << 13;

int rez[20], X[2][20], Y[2][20], dp[1 << 17][20], poz;

inline int min (int a, int b) {
    return (a < b ? a : b);
}

inline int sq (int X) {
    return X * X ;
}

char ch[ hg ] ;

inline void cit ( int &x ) {
    if ( ch[0] == '\0' ) fread ( ch, 1, hg, stdin ) ;
    else for ( ; ch[poz] < '0' || ch[poz] > '9' ; verf ) ;
    for ( x = 0 ; ch[poz] >= '0' && ch[poz] <= '9' ; x = x * 10 + ch[poz] - '0', verf ) ;
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    memset (rez, 0x3f, sizeof (rez));
    rez[1] = 0;
    for (int x = 0, cnt = 1, bit = 0, I = 1; ; cnt = bit, I ^= 1) {
        cit (x);
        if (x == 2) break ;
        for (cit (X[I][1]), cit (Y[I][1]), cit (x), bit = 1; ; cit (X[I][++bit]), cit (Y[I][bit]), cit (x)) {
            if (x == 1) break ;
        }
        for (int i = 1; i < 1 << bit; ++i) {
            for (int j = 1, k = 1; j <= i; j <<= 1, ++k) {
                if (i & j) {
                    dp[i][k] = oo;
                    if (j == i) {
                        for (int ii = 1; ii <= cnt; ++ii)
                            dp[i][k] = min (dp[i][k], rez[ii] + sq (X[I][k] - X[I ^ 1][ii]) + sq (Y[I][k] - Y[I ^ 1][ii]));
                    } else {
                        for (int ii = 1, jj = 1; ii <= i; ii <<= 1, ++jj)
                            if ((ii & i) && ii != j)
                                dp[i][k] = min (dp[i][k], dp[i ^ j][jj] + sq (X[I][k] - X[I][jj]) + sq (Y[I][k] - Y[I][jj]));
                    }
                }
            }
        }
        int solution = oo;
        for (int i = 1; i <= bit; ++i) {
            rez[i] = dp[(1 << bit) - 1][i];
            solution = min (solution, rez[i]);
        }
        printf ("%d\n", solution);
    }
}