Cod sursa(job #334404)

Utilizator Mishu91Andrei Misarca Mishu91 Data 26 iulie 2009 17:27:58
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX_N 105

const int Tmax = 100;

struct lapte {int a, b, d, ord;} V[MAX_N];
int N, logT, L;
int SolA[MAX_N], SolB[MAX_N];

struct cmp
{
	bool operator()(const lapte &a, const lapte &b) const
	{
		return a.d < b.d;
	}
};

void citire()
{
	scanf("%d %d",&N, &L);
	
	for(int i = 1; i <= N; ++i)
	{
		scanf("%d %d",&V[i].a, &V[i].b);
		V[i].d = V[i].a - V[i].b;
		V[i].ord = i;
	}
	
	sort(V+1, V+N+1, cmp());
	
	for(logT = 1; logT < Tmax; logT <<= 1);
}

int check(int k)
{
	int La[MAX_N], Lb[MAX_N], ca(L), cb(L), T[MAX_N];
	for(int i = 1; i <= N; ++i)
	{
		 La[i] = min(k/V[i].a, ca);
		 ca -= La[i];
		 T[i] = k - La[i]*V[i].a;
	}
	
	for(int i = N; i; --i)
	{
		Lb[i] = min(T[i]/V[i].b, cb);
		cb -= Lb[i];
	}
	
	return ((ca == 0) && (cb == 0));
}

void solve()
{
	int i, lg;
	for(i = Tmax, lg = logT; lg; lg >>= 1)
		if(i - lg > 0 && check(i - lg))
			i -= lg;
		
	printf("%d\n",i);
	
	int La[MAX_N], Lb[MAX_N], ca(L), cb(L), T[MAX_N], k = i;
	for(int i = 1; i <= N; ++i)
	{
		 La[V[i].ord] = min(k/V[i].a, ca);
		 ca -= La[V[i].ord];
		 T[i] = k - La[V[i].ord]*V[i].a;
	}
	
	for(int i = N; i; --i)
	{
		Lb[V[i].ord] = min(T[i]/V[i].b, cb);
		cb -= Lb[V[i].ord];
	}
	
	for(int i = 1; i <= N; ++i)
		printf("%d %d\n",La[i], Lb[i]);
}

int main()
{
	freopen("lapte.in","rt",stdin);
	freopen("lapte.out","wt",stdout);
	
	citire();
	solve();
}