Cod sursa(job #717213)

Utilizator Catah15Catalin Haidau Catah15 Data 19 martie 2012 19:05:02
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>

using namespace std;

#define maxN 110
#define Tmax 210
#define f first
#define s second
#define MKP make_pair
#define PB push_back
#define inf (1 << 30)

int DP[maxN][maxN];
int vA[maxN], vB[maxN];
int N, L;
pair <int, int> sol[maxN][maxN];
vector <pair <int, int> > ans;


bool solve2 (int T)
{
	for (int i = 0; i <= N; ++ i)
		for (int j = 0; j <= L; ++ j) DP[i][j] = - inf;
	DP[0][0] = 0;
	
	for (int i = 1; i <= N; ++ i)
		for (int a = 0; a <= L; ++ a)
			for (int t = 0; t <= T; t += vA[i])
			{
				int nrA = t / vA[i];
				int nrB = (T - t) / vB[i];
				
				if (DP[i][a] < nrB + DP[i - 1][max (0, a - nrA)])
				{
					DP[i][a] = nrB + DP[i - 1][max (0, a - nrA)];
					sol[i][a].f = nrA;
					sol[i][a].s = nrB;
				}
			}
	
	if (DP[N][L] >= L) return true;
	return false;
}


bool solve (int T)
{
	for (int i = 0; i <= N; ++ i)
		for (int j = 0; j <= L; ++ j) DP[i][j] = - inf;
	DP[0][0] = 0;
	
	for (int i = 1; i <= N; ++ i)
		for (int a = 0; a <= L; ++ a)
			for (int t = 0; t <= T; t += vA[i])
			{
				int nrA = t / vA[i];
				int nrB = (T - t) / vB[i];
				
				if (DP[i][a] < nrB + DP[i - 1][max (0, a - nrA)]) DP[i][a] = nrB + DP[i - 1][max (0, a - nrA)];
			}
			
	if (DP[N][L] >= L) return true;
	return false;
}


int bin_Search (int lo, int hi)
{
	int res = hi + 1;
	
	while (lo <= hi)
	{
		int mid = (lo + hi) / 2;
		
		if (solve (mid))
		{
			res = min (res, mid);
			hi = mid - 1;
		}
		else lo = mid + 1;
	}
	
	return res;
}


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", &vA[i], &vB[i]);
	
	int T = bin_Search (1, 105);

	printf ("%d\n", T);
	solve2 (T);
	
	int last = L;
	for (int i = N; i >= 1; -- i)
	{
		ans.PB ( MKP (sol[i][last].f, sol[i][last].s) );
		last = last - sol[i][last].f;
	}
	
	for (int i = ans.size() - 1; i >= 0; -- i) printf ("%d %d \n", ans[i].f, ans[i].s);
	
	return 0;
}