Cod sursa(job #1031225)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 15 noiembrie 2013 17:37:06
Problema Magazin Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.86 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define nmax 30111
#define pb push_back
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define sz size()
#define inf 1000111000

vector <int> P[nmax];
int H[nmax][6],n,m,p,D;

int main()
{
    int ii,j,i,a,b,c;
    freopen("magazin.in","r",stdin);
    freopen("magazin.out","w",stdout);

    scanf("%d %d %d %d",&p,&n,&m,&D);
    FOR(ii,0,p)
    {
        scanf("%d %d",&i,&j);
        P[i].pb(j);
    }
/*
0   1   2   3   4nc 5nc
->   ->       ->   ->   ->
    <-           <-
... ... ... ... ... ...
    ->   ->   <-   ->   <-
            ->       ->
*/
    H[0][2]=0;
    H[0][0]=H[0][1]=H[0][3]=H[0][4]=H[0][5]=inf;
    FOR(i,1,n+1)
    {
        if(P[i].sz==0)
            a=b=c=0;
        else
        {
            sort(P[i].begin(),P[i].end());
            a=m+1-P[i][0];          //sus
            b=P[i][P[i].sz-1];      //jos
            c=min(a,b);             //combinat
            FOR(j,0,P[i].sz-1)
                c=min(c,P[i][j]+m+1-P[i][j+1]);
            c*=2,a*=2,b*=2;
        }
        //0
        H[i][0]=H[i-1][0]+a+D;
        H[i][0]=min(H[i][0],H[i-1][1]+m+1+D);
        H[i][0]=min(H[i][0],H[i-1][2]+m+1+D);
        H[i][0]=min(H[i][0],H[i-1][3]+c+D);
        H[i][0]=min(H[i][0],H[i-1][4]+m+1+D);
        H[i][0]=min(H[i][0],H[i-1][5]+2*(m+1)+D);

        //1
        H[i][1]=H[i-1][0]+m+1+3*D;
        H[i][1]=min(H[i][1],H[i-1][1]+c+3*D);
        H[i][1]=min(H[i][1],H[i-1][2]+2*(m+1)+3*D);
        H[i][1]=min(H[i][1],H[i-1][3]+m+1+3*D);
        H[i][1]=min(H[i][1],H[i-1][4]+2*(m+1)+3*D);
        H[i][1]=min(H[i][1],H[i-1][5]+m+1+3*D);

        //2
        H[i][2]=H[i-1][0]+m+1+D;
        H[i][2]=min(H[i][2],H[i-1][1]+c+D);
        H[i][2]=min(H[i][2],H[i-1][2]+b+D);
        H[i][2]=min(H[i][2],H[i-1][3]+m+1+D);
        H[i][2]=min(H[i][2],H[i-1][4]+2*(m+1)+D);
        H[i][2]=min(H[i][2],H[i-1][5]+m+1+D);

        //3
        H[i][3]=H[i-1][0]+2*(m+1)+3*D;
        H[i][3]=min(H[i][3],H[i-1][1]+m+1+3*D);
        H[i][3]=min(H[i][3],H[i-1][2]+m+1+3*D);
        H[i][3]=min(H[i][3],H[i-1][3]+c+3*D);
        H[i][3]=min(H[i][3],H[i-1][4]+m+1+3*D);
        H[i][3]=min(H[i][3],H[i-1][5]+2*(m+1)+3*D);

        //4
        H[i][4]=H[i-1][0]+m+1+D;
        H[i][4]=min(H[i][4],H[i-1][1]+c+D);
        H[i][4]=min(H[i][4],H[i-1][2]+b+D);
        H[i][4]=min(H[i][4],H[i-1][3]+m+1+D);
        H[i][4]=min(H[i][4],H[i-1][4]+c+3*D);
        H[i][4]=min(H[i][4],H[i-1][5]+m+1+D);

        //5
        H[i][5]=H[i-1][0]+a+D;
        H[i][5]=min(H[i][5],H[i-1][1]+m+1+D);
        H[i][5]=min(H[i][5],H[i-1][2]+m+1+D);
        H[i][5]=min(H[i][5],H[i-1][3]+c+D);
        H[i][5]=min(H[i][5],H[i-1][4]+m+1+D);
        H[i][5]=min(H[i][5],H[i-1][5]+c+3*D);
    }
    printf("%d\n",min(H[n][2]-D,H[n][1]-3*D));
    return 0;
}