Cod sursa(job #854718)

Utilizator crushackPopescu Silviu crushack Data 13 ianuarie 2013 21:36:28
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <algorithm>
#define NMax 110
using namespace std;

const char IN[]="lapte.in",OUT[]="lapte.out";

struct copil{
	int x,y;
} v[NMax], r[NMax];

int N,L,Rez;
int idx[NMax];

bool test(int T)
{
	int i,lA=0,lB=0,a;
	for (i=1;i<=N;++i)
		r[idx[i]].x=T/v[idx[i]].x,
		lA+=r[idx[i]].x,
		r[idx[i]].y=0;

	for (i=1;i<=N && lB<L;++i)
	{
		a=lB;
		for (;r[idx[i]].x>=0 && lB<L;--r[idx[i]].x){
			r[idx[i]].y=(T-r[idx[i]].x*v[idx[i]].x)/v[idx[i]].y;
			lB=a+r[idx[i]].y;
			if (lB==L || !r[idx[i]].x) break;
		}
	}

	for (i=1,lA=0;i<=N;++i) lA+=r[idx[i]].x;

	return lA>=L && lB>=L;
}

int search()
{
	int i,step;
	for (step=1;step<NMax;step<<=1);
	for (i=NMax;step;step>>=1)
		if (i-step>0 && test(i-step))
			i-=step;
	return i;
}

bool cmp(int x,int y){
	return v[x].x/(double)v[x].y<v[y].x/(double)v[y].y;
}

int main()
{
	int i;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&L);
	for (i=1;i<=N;++i) scanf("%d%d",&v[i].x,&v[i].y);
	fclose(stdin);

	for (i=1;i<=N;++i) idx[i]=i;
	sort(idx+1,idx+N+1);

	Rez=search();
	test(Rez);

	freopen(OUT,"w",stdout);
	printf("%d\n",Rez);
	for (i=1;i<=N;++i) printf("%d %d\n",r[i].x,r[i].y);
	fclose(stdout);
	return 0;
}