Cod sursa(job #331460)

Utilizator marinMari n marin Data 14 iulie 2009 08:46:36
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <stdio.h>

struct pct{
	int a;
	int b;
};

struct sol{
	int i;
	int a;
	int b;
};

sol U[210][210];
sol USol[210][210];

pct P[210];

int V[210]; //V[i] = nr maxim de litri de tip b bauti stiind ca s-au baut i litri de tip a
int W[210][210];
int WSol[210][210];

int Tata[210][210];
int TataSol[210][210];

pct S[210];


int p,u,N,L,T,i,j,k,poate,a,b,ni,nv,x,t,t1,t2,iSol,xSol;

int main(){
	FILE *f = fopen("lapte.in","r");
	fscanf(f,"%d %d", &N, &L);
	for (i=1;i<=N;i++) {
		fscanf(f,"%d %d",&P[i].a, &P[i].b);
	}
	fclose(f);
	
	p=1;
	u=101;
	while (p<=u) {
		T = (p+u)/2;
		
		for (i=0;i<=200;i++) {
			W[0][i] = W[1][i] = -1;
		}
		poate = 0;
		for (i=1;i<=N;i++) {
/*			for (j=0;j<=200;j++) {
				V[j] = W[j];
			}
*/
			for (j=0;j<=2*L;j++)
				W[i][j] = -1;
			for (j=0;j*P[i].a<=T;j++) {
				a = j;
				b = (T-j*P[i].a)/P[i].b;
				
				if (W[i][a]<b) {
					W[i][a] = b;
					Tata[i][a] = 0;
					
					U[i][a].a = a;
					U[i][a].b = b;
				}

				if (a>=L && b>=L) {
					poate = 1;
					xSol = a;
					iSol = i;
					
					for (t1=1;t1<=N;t1++)
						for (t2=0;t2<=2*L;t2++){
							WSol[t1][t2] = W[t1][t2];
							TataSol[t1][t2] = Tata[t1][t2];
							USol[t1][t2] = U[t1][t2];
						}

					break;
				}

				for (k=0;k<=L;k++)
					if (W[i-1][k]!=-1) {
						ni = k+a;
						nv = W[i-1][k]+b;
						
						if (W[i][ni]<nv){
							W[i][ni] = nv;
							Tata[i][ni] = k;
							
							U[i][ni].a = a;
							U[i][ni].b = b;
						}
						
								
						
						if (ni>=L && nv>=L) {
							iSol = i;
							xSol = ni;
							for (t1=1;t1<=N;t1++)
								for (t2=0;t2<=2*L;t2++){
									WSol[t1][t2] = W[t1][t2];
									TataSol[t1][t2] = Tata[t1][t2];
									USol[t1][t2] = U[t1][t2];
								}
							
							poate = 1;
							break;
						}
						
					}
				if (poate)
					break;
			}
			if (poate)
				break;
		}
		
		
		if (poate) {
			u = T-1;
		} else {
			p = T+1;
		}
	}
	
	for (i=iSol;i>0;i--) {
		S[i].a = USol[i][xSol].a;
		S[i].b = USol[i][xSol].b;
		xSol = TataSol[i][xSol];
	}
	
/*
	a = x;
	b = WSol[x];
	while (a!=0 || b!=0) {
		a -= USol[x].a;b -= USol[x].b;	
		S[USol[x].i].a = USol[x].a;
		S[USol[x].i].b = USol[x].b;
		x = TataSol[x];
	}
*/
	
	FILE *g = fopen("lapte.out","w");
	fprintf(g,"%d\n",p);
	for (i=1;i<=N;i++)
		fprintf(g,"%d %d\n",S[i].a,S[i].b);
	fclose(g);
	return 0;
}