Cod sursa(job #1960165)

Utilizator Daria09Florea Daria Daria09 Data 10 aprilie 2017 11:30:31
Problema Magazin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <algorithm>
#define inf 0x3f3f3f3f
#define DIM 30003
using namespace std;
ifstream f("magazin.in");
ofstream g("magazin.out");
int n,m,d,p,c[DIM][6],produs[DIM][26],t1[DIM],t2[DIM],t3[DIM];
void read()
{
    f>>p>>n>>m>>d;int x,y;
    for(int i=1;i<=p;i++)
    {
        f>>x>>y;
        produs[x][++produs[x][0]]=y;
    }
    f.close();
}
void solve()
{
    for(int i=1;i<=n;i++)
        sort(produs[i]+1,produs[i]+produs[i][0]+1);
    for(int i=1;i<=n;i++)
    {
        if(produs[i][0]==0){t1[i]=t2[i]=d; t3[i]=3*d; continue;}
        t1[i]=d+2*produs[i][produs[i][0]];
        t2[i]=d+2*(m+1-produs[i][1]);
        t3[i]=min(t1[i],t2[i])+2*d;
        for(int j=1;j<produs[i][0];++j)
        {
            int t=2*produs[i][j]+2*(m+1-produs[i][j+1])+3*d;
            t3[i]=min(t3[i],t);
        }
    }
    c[1][0]=t1[1]-d;
    c[1][1]=2*(m+1);
    c[1][2]=min(t2[1]-d,t3[1]-3*d);
    c[1][3]=inf;
    c[1][4]=m+1;
    c[1][5]=inf;
    for(int i=2;i<=n;i++)
    {
        c[i][0]=c[i][1]=c[i][2]=c[i][3]=c[i][4]=c[i][5]=inf;
        c[i][0]=min(c[i][0],c[i-1][0]+t1[i]);
        c[i][0]=min(c[i][0],c[i-1][1]+t1[i]);
        c[i][0]=min(c[i][0],c[i-1][2]+2*(m+1)+t1[i]);
        c[i][0]=min(c[i][0],c[i-1][3]+(m+1)+t1[i]);
        c[i][0]=min(c[i][0],c[i-1][4]+(m+1)+t1[i]);
        c[i][0]=min(c[i][0],c[i-1][5]+(m+1)+t1[i]);

        c[i][1]=min(c[i][1],c[i-1][0]+d+2*(m+1));
        c[i][1]=min(c[i][1],c[i-1][1]+min(min(t1[i],t2[i])+2*d,t3[i]));
        c[i][1]=min(c[i][1],c[i-1][2]+d+2*(m+1));
        c[i][1]=min(c[i][1],c[i-1][3]+d+(m+1));
        c[i][1]=min(c[i][1],c[i-1][4]+d+(m+1));
        c[i][1]=min(c[i][1],c[i-1][5]+3*d+(m+1));

        c[i][2] =  min(c[i][2], c[i-1][0] + min(t2[i], t3[i]-2*d));
        c[i][2] =  min(c[i][2], c[i-1][1] + min(t2[i], t3[i]-2*d));
        c[i][2] =  min(c[i][2], c[i-1][2] + min(min(t1[i], t2[i])+2*d, t3[i]));
        c[i][2] =  min(c[i][2], c[i-1][3] + min(t2[i], t3[i]-2*d) + (m+1));
        c[i][2] =  min(c[i][2], c[i-1][4] + min(t2[i], t3[i]-2*d) + (m+1));
        c[i][2] =  min(c[i][2], c[i-1][5] + min(t2[i], t3[i]-2*d) + (m+1));

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

        c[i][4] =  min(c[i][4], c[i-1][3] + d+ 2*(m+1));
        c[i][4] =  min(c[i][4], c[i-1][4] + min(min(t1[i], t2[i])+2*d, t3[i]));
        c[i][4] =  min(c[i][4], c[i-1][5] + d + 2*(m+1));
        c[i][4] =  min(c[i][4], c[i-1][0] + d + (m+1));
        c[i][4] =  min(c[i][4], c[i-1][1] + d + (m+1));
        c[i][4] =  min(c[i][4], c[i-1][2] + 3*d + (m+1));

        c[i][5] =  min(c[i][5], c[i-1][3] + min(t1[i], t3[i]-2*d));
        c[i][5] =  min(c[i][5], c[i-1][4] + min(t1[i], t3[i]-2*d));
        c[i][5] =  min(c[i][5], c[i-1][5] + min(min(t1[i], t2[i])+2*d, t3[i]));
        c[i][5] =  min(c[i][5], c[i-1][0] + min(t1[i], t3[i]-2*d) + (m+1));
        c[i][5] =  min(c[i][5], c[i-1][1] + min(t1[i], t3[i]-2*d) + (m+1));
        c[i][5] =  min(c[i][5], c[i-1][2] + min(t1[i], t3[i]-2*d) + (m+1));
    }
    g<<min(c[n][0],c[n][1]);
}
int main()
{
    read();
    solve();
    return 0;
}