Cod sursa(job #2001363)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 16 iulie 2017 15:16:02
Problema Magazin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 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);
    }
    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];
            b=P[i][P[i].sz-1];
            c=min(a,b);
            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;
        }
        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);

        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);

        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);

        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);

        H[i][4]=H[i-1][0]+m+1+3*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);

        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;
}