Cod sursa(job #34692)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 21 martie 2007 11:05:02
Problema Magazin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 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;
}