Cod sursa(job #508554)

Utilizator ooctavTuchila Octavian ooctav Data 8 decembrie 2010 20:44:37
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;

const int INF = 1000000005;
const int NMAX = 105;
const int TMAX = 105;
const int LMAX = 105;
const int lg_TMAX = 7;


int N, L, T;
pair<int, int> cost[NMAX];
int d[NMAX][LMAX], vine[NMAX][LMAX];

void citi()
{
	scanf("%d%d", &N, &L);
	for(int i = 1 ; i <= N ; i++)
		scanf("%d%d", &cost[i].first, &cost[i].second);
}

void init()
{
	for(int i = 1 ; i <= NMAX ; i++)
		for(int j = 0 ; j <= LMAX ; j++)
			d[i][j] = -INF;
}

int dinamic(int t)
{
	for(int k = 0 ; cost[1].first * k <= t && k <= L ; k++)
		d[1][k] = (t - cost[1].first * k)/cost[1].second;
		
	for(int i = 1 ; i < N ; i++)
		for(int j = 0 ; j <= L ; j++)
			for(int k = 0 ; cost[i + 1].first * k <= t && k + j <= L ; k++)
				if(d[i][j] + (t - cost[i + 1].first * k)/cost[i + 1].second >= d[i + 1][j + k])
				{
					d[i + 1][j + k] = d[i][j] + (t - cost[i + 1].first * k)/cost[i + 1].second;
					vine[i + 1][j + k] = j;
				}
	if(d[N][L] >= L)
		return 1;
	return 0;
}

void caut_bin()
{
	int Q = 1<<lg_TMAX;
	while(Q)
	{
		if(T + Q < TMAX && !dinamic(T + Q))
			T += Q;
		init();
		Q >>= 1;
	}
	T++;
	dinamic(T);
}

void scrie()
{
	printf("%d\n", T);
	pair<int, int> sol[NMAX];
	int NR = 0;
	
	for(int i = N , j = L; i ; i--)
	{
		sol[++NR].first = j - vine[i][j];
		sol[NR].second = d[i][j] - d[i - 1][vine[i][j]];
		j = vine[i][j];
	}
	for(int i = 1 ; i <= N ; i++)
		printf("%d %d\n", sol[i].first, sol[i].second);
}

int main()
{
	freopen("lapte.in", "r", stdin);
	freopen("lapte.out", "w", stdout);
	citi();
	caut_bin();
	scrie();
	return 0;
}