Cod sursa(job #25384)

Utilizator astronomyAirinei Adrian astronomy Data 4 martie 2007 12:22:02
Problema Magazin Scor 15
Compilator c Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 1.17 kb
#include <stdio.h>

#define min(a,b) ((a) < (b) ? (a) : (b))
#define abs(x) ((x) < 0 ? (-(x)) : (x))

int N, M, P, D, res, afis;

int A[16][2];

int x[16], uz[16];

int cost(void)
{
    int i, j, c, r = 0, d1, d2;
    
    for(i = 1; i < P; i++)
    {
        d1 = A[x[i]][1], d2 = A[x[i+1]][1];
        c = abs(A[x[i]][0]-A[x[i+1]][0])*D;
        if(c == 0)
            c += abs(d1-d2);
        else
            c += min(2*M+2-d1-d2, d1+d2);
        r += c;
    }

    r += (A[x[1]][0]-1)*D+A[x[1]][1];
    r += (N-A[x[P]][0])*D+A[x[P]][1];

    return r;
}

void bkt(int k)
{
    int i, s;
    
    if(k == P+1)
    {
        s = cost();
        if(s < res)
            res = s;
    }
    else
        for(i = 1; i <= P; i++)
         if(!uz[i])
            uz[i] = 1, x[k] = i, bkt(k+1), uz[i] = 0;
}

int main(void)
{
    freopen("magazin.in", "rt", stdin);
    freopen("magazin.out", "wt", stdout);

    int i, j, k;

    scanf("%d %d %d %d\n", &P, &N, &M, &D);
    for(i = 1; i <= P; i++)
        scanf("%d %d\n", &A[i][0], &A[i][1]);

    res = 2000000000;
    bkt(1);

    printf("%d\n", res);
    
    return 0;
}