Cod sursa(job #1020414)

Utilizator ELHoriaHoria Cretescu ELHoria Data 2 noiembrie 2013 00:48:23
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
     
using namespace std;
     
const int NMAX = 102;
int dp[NMAX][NMAX];
int who[NMAX][NMAX];
int N, L;
int a[NMAX], b[NMAX];
int ra[NMAX], rb[NMAX];

int solve(int t) {
	int lapteA, lapteB;
	for(int k = 0;k <= L;k++) {
		dp[1][k] = -int(1e9);
	}
	lapteA = min(L,t/a[1]);
	for(int k = 0;k <= lapteA;k++) {
		dp[1][k] = (t - a[1]*k)/b[1];
		who[1][k] = 1 | k<<7;
	}

	for(int i = 2;i <= N;i++) {
		for(int k = 0;k <= L;k++) {
			dp[i][k] = dp[i - 1][k];
			who[i][k] = who[i - 1][k];
		}
		lapteA = min(L,t/a[i]);
		for(int j = 0;j <= lapteA;j++) {
			lapteB = (t - a[i]*j)/b[i];
			if(dp[i][j] < lapteB) {
				dp[i][j] = lapteB;
				who[i][j] = i | j<<7;
			}
			for(int k = j;k <= L;k++) {
				if(dp[i - 1][k - j] + lapteB > dp[i][k]) {
					dp[i][k] = dp[i - 1][k - j] + lapteB;
					who[i][k] = i | j<<7;
				}
			}
		}
	}

	return dp[N][L] >= L;
}

void build(int milk,int t) {
	int i = N;
//	printf("\n");
	while(milk || who[i][milk] != 0) {
//		printf("(%d)\n",i);
		while(i > (who[i][milk] & 127)) i--;
		int j = who[i][milk]>>7;
		ra[i] += j;
		rb[i] += (t - a[i]*j)/b[i];
		i--;
		milk -= j;
	}
}
     
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d %d",&N,&L);
	for(int i = 1;i <= N;i++) {
		scanf("%d %d",&a[i],&b[i]);
	}
	
	int t = 0;
	
	for(int step = 64;step > 0;step >>= 1) {
		if(solve(t + step) == false) {
			t += step;
		}
	}
	
	t++;
	printf("%d\n",t);
	solve(t);
	build(L,t);
	for(int i = 1;i <= N;i++) {
		printf("%d %d\n",ra[i],rb[i]);
	}
    return 0;
}