Cod sursa(job #2427480)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 31 mai 2019 22:12:09
Problema Magazin Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define INF 2000000000
#define DIMN 30010
using namespace std;
int d[DIMN][6];

vector <int> v[DIMN];
pair <int,int> w[DIMN];
int main()
{
    FILE *fin=fopen ("magazin.in","r");
    FILE *fout=fopen ("magazin.out","w");
    int p,n,m,dst,x,y,up,down,mini,i,j;
    fscanf (fin,"%d%d%d%d",&p,&n,&m,&dst);
    for (i=1;i<=p;i++){
        fscanf (fin,"%d%d",&w[i].first,&w[i].second);
    }
    sort (w+1,w+p+1);
    for (i=1;i<=p;i++)
        v[w[i].first].push_back(w[i].second);


    for (i=1;i<=n;i++){

        if (v[i].size()){ /// sunt cateva produse aici
            up = v[i][v[i].size()-1];
            down = m+1 - v[i][0];
            mini = min (up,down);
            for (j = 0; j<v[i].size()-1 ; j++){
                mini = min (mini, v[i][j] + m+1 - v[i][j + 1]);
            }
            up*=2;
            down*=2;
            mini*=2;
        }
        else { /// nu e niciun produs aici
            up = down = mini = 0;
        }
        for (j=0;j<6;j++)
            d[i][j] = INF;

        if (i==1){
            d[i][3] = up;
            d[i][4] = m+1;
            d[i][5] = mini;
        }

        else {

            d[i][0] = min (d[i][0] , dst + min (d[i-1][0] + down , d[i-1][4] + down));

            d[i][1] = min (d[i][1] , min (  min ( d[i-1][0] + dst + m+1, d[i-1][2] + 3*dst + m+1) ,
                    min( d[i-1][4] +dst + m+1, d[i-1][1] + 3*dst + mini )  ));

            d[i][2] = min (d[i][2] , min( d[i-1][0] + dst + mini , d[i-1][2] + 3*dst + mini));

            /// -----------------------------------------------------------------------

            d[i][3] = min (d[i][3] , dst + min ( d[i-1][3] + up , d[i-1][1] + up ));

            d[i][4] = min (d[i][4] , min ( min (d[i-1][3] + dst + m+1, d[i-1][5] + dst * 3 + m+1) ,
                    min ( d[i-1][4] + mini + 3* dst , d[i-1][1] + dst + m+1  )));

            d[i][5] = min ( d[i][5] , min ( d[i-1][3] + dst + mini , d[i-1][5] + 3 * dst + mini ));
        }
        //for (j=0;j<6;j++){
          //  printf ("%d ",d[i][j]);
        //}
        //printf ("\n");


    }
    fprintf (fout,"%d" , min (d[n][3] , d[n][1]));
    return 0;
}