Cod sursa(job #212984)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 8 octombrie 2008 00:16:38
Problema Lapte Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
using namespace std;

#include <algorithm>
#include <vector>
#include <cstdio>
#include <utility>
#include <functional>

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<7
#define o first.first
#define f first.second
#define s second.first
#define poz second.second
#define IN "lapte.in"
#define OUT "lapte.out"
#define II inline

vector< pair< pair<int,int> ,pair<int,int> > > V(N_MAX),S(N_MAX);
char buffer[1<<10];
int MIJ,rez(1<<29),VA,VB,K(-1),N,L;

II int read()
{
	int aux(0);
	for(;buffer[K] > '9' || buffer[K] < '0';++K);
	for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
		aux = aux * 10 + buffer[K] - '0';
	return aux;
}

II void scan()
{
	freopen(OUT,"w",stdout);
	freopen(IN, "r",stdin);
	fread(buffer,1,1<<10,stdin);
	fclose(stdin);
	N = read();
	L = read();
	V.resize(N+1);
	S.resize(N+1);
	FOR(i,1,N)
	{
		V[i].f = read();
		V[i].s = read();
		V[i].poz = i;
		V[i].o = V[i].f - V[i].s;
	}	
	sort(V.begin()+1, V.end() );
	MIJ = N;
	FOR(i,1,N)
		if(V[i].o > 0)
		{	
			MIJ = i-1;
			break;
		}	
	FOR(i,1,N)
		S[i].o = V[i].poz;
}


II bool ok(int T)
{
	int a = L,b = L;
	
	FOR(i,1,MIJ)
	{
		S[i].f = min(T / V[i].f,a);
		a -= min(T / V[i].f,a);
		S[i].s = min( (T - S[i].f * V[i].f) / V[i].s,b);
		b -= min( (T - S[i].f * V[i].f) / V[i].s,b); 
	}	
	FOR(i,MIJ+1,N)
	{
		S[i].s = min(T / V[i].s,b);
		b -= min(T / V[i].s,b);
		S[i].f = min( (T - S[i].s * V[i].s) / V[i].f,a);
		a -= min( (T - S[i].s * V[i].s) / V[i].f,a); 
	}	
	
	if(a <= 0 && b <=0)
		return true;
	if(a > 0 && b > 0)
		return false;
	if(a > 0)
		for(int i=MIJ+1;i<=N && a > 0;++i)
		{
			b += S[i].f;
			a += S[i].s; 
			
			S[i].f = min(T / V[i].f,a);
			a -= min(T / V[i].f,a);
			S[i].s = min( (T - S[i].f * V[i].f) / V[i].s,b);
			b -= min( (T - S[i].f * V[i].f) / V[i].s,b); 
		}
	if(b > 0)
		for(int i=MIJ;i>=1 && b > 0;--i)
		{
			a += S[i].f;
			b += S[i].s; 

			S[i].s = min(T / V[i].s,b);
			b -= min(T / V[i].s,b);
			S[i].f = min( (T - S[i].s * V[i].s) / V[i].f,a);
			a -= min( (T - S[i].s * V[i].s) / V[i].f,a); 
		}	
	
	if(a>0 || b>0)
		return false;
	return true;
}

II void print();
II void solve()
{
	FOR(i,1,N)
		VA += V[i].f,
		VB += V[i].s;
		
	int T,step;
    for(step = 1; step <= 100; step <<= 1);
    for(T = 1; step; step >>= 1)
		if(T + step <= 100 && !ok(T+step-1) )
			T += step;
	ok(T);
	if(T > rez)
		return;
	rez = T;
	sprintf(buffer,"%d\n",T);

	sort(S.begin()+1,S.end());
	print();
}	

II void print()
{
	FOR(i,1,N)
		sprintf(buffer,"%s%d %d\n",buffer,S[i].f,S[i].s);
	//freopen(OUT,"w",stdout);
	printf("%s",buffer);
	fclose(stdout);
}

int main()
{
	scan();
	solve();
	return 0;
}