Cod sursa(job #478356)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 18 august 2010 11:20:21
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <queue>
#define Nmax 153
#define x first
#define y second
#define mp make_pair

using namespace std;

queue< pair<int,int> > Q[2];
int A[Nmax],B[Nmax],Caf[Nmax],Cbf[Nmax];
int inq[Nmax][Nmax],last[Nmax][Nmax],ca[Nmax][Nmax],cb[Nmax][Nmax];
int n,L;

int merge(int T ){
	int i,j,j2,st; pair< int,int > p;
	while( !Q[0].empty() ) Q[0].pop();
	while( !Q[1].empty() ) Q[1].pop();
	for(i=1;i<=L;++i) for(j=1;j<=L;++j) inq[i][j]=0;
	
	Q[0].push(mp(0,0)); st=0;

	for(i=1;i<=n;++i){
		
		while( ! Q[st].empty() ){
			p=Q[st].front(); Q[st].pop();
			if( inq[L][L] ) return 1;
			
			for(j=0; j*A[i]<=T && p.x+j<=L; ++j ){
				j2 = (T-j*A[i])/B[i];
				if( p.y+j2>L )j2=L-p.y;
				if( j==0 && j2==0 ) continue; 
	
				if( ! inq[p.x+j][p.y+j2] ){
					inq[p.x+j][p.y+j2]=1;
					last[p.x+j][p.y+j2]=i, ca[p.x+j][p.y+j2]=j, cb[p.x+j][p.y+j2]=j2;
					Q[st^1].push(mp(p.x+j,p.y+j2));
				}
			}
		}
		st^=1;
	}
	if( inq[L][L] ) return 1;
	return 0;
}

void afis(int T ){
	int i,ii,j;
	i=L, j=L;
	while( i>0 || j>0 ){
		Caf[last[i][j]]=ca[i][j], Cbf[last[i][j]]=cb[i][j];
		ii=i;
		i-=ca[i][j], j-=cb[ii][j];
	}
	
	printf("%d\n",T);
	for(i=1;i<=n;++i)
		printf("%d %d\n",Caf[i],Cbf[i]);
}

int main(){
	int i,l,r,mij,rez;
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d%d",&n,&L);
	for(i=1;i<=n;++i) scanf("%d%d",&A[i],&B[i]);
	
	l=0, r=150;
	while( l<=r ){
		mij=l+(r-l)/2;
		if( merge(mij) ) rez=mij, r=mij-1;
		else l=mij+1;
	}
	
	afis(rez);
	
	fclose(stdin); fclose(stdout);
	return 0;
}