Cod sursa(job #210012)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 25 septembrie 2008 23:10:16
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n, l, b[101], a[101], ca, cb, ord1[101], ord2[101], timp[101], reconst;
int tmpa[101], tmpb[101];

int min(int x, int y) { return x < y ? x : y;}

int cmp1(const void *x, const void *y)
{
	int i = *(int*)x, j = *(int*)y;
	return a[i] - a[j];
}

int cmp2(const void *x, const void *y)
{
	int i = *(int*)x, j = *(int*)y;
	return b[i] - b[j];
}


void citire()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d %d", &n, &l);
	int i;
	for (i=1; i<=n; i++)
	{
		scanf("%d %d",&a[i], &b[i]);
		ord1[i] = ord2[i] = i;
	}
}

void doit(int i, int t, int &ta, int &tb, int a[], int b[])
{
	int j, k, sa, sb, x;
	memset(timp, 0, sizeof(timp));
	if (reconst)
	{
	memset(tmpa,0,sizeof(tmpa));
	memset(tmpb,0,sizeof(tmpb));
	}

	sa = 0; sb = 0;
	for (j = 1; tb < l && j <= n; j++)
	{
		x = l - tb;
		tmpb[ord2[j]] = min(((t - timp[ord2[j]]) / b[ord2[j]]), x);
		tb += tmpb[ord2[j]];
		timp[ord2[j]] += min(((t - timp[ord2[j]]) / b[ord2[j]] * b[ord2[j]]),(x * b[ord2[j]]));
	}
	for (j = 1; ta < l && j <= n; j++)
	{
		x = l - ta;
		tmpa[ord1[j]] = min((t-timp[ord1[j]]) / a[ord1[j]],x);
		ta += tmpa[ord1[j]];
		timp[ord1[j]] += min(((t - timp[ord1[j]]) / a[ord1[j]] * a[ord1[j]]),(x * a[ord1[j]]));
	}


}


int verif(int T)
{
	int aa, bb, i;
	aa = bb = 0;
	doit(i,T,aa,bb,a,b);
	if (aa >= l && bb >= l) return 1;
	return 0;
}

int search()
{
	int p, u, m;
	p = 1; u =30;
	while (p <= u)
	{
		m = (p + u) / 2;
		if (verif(m) && !verif(m - 1)) return m;
		else if (verif(m - 1)) u = m - 1;
		else if (!verif(m)) p = m + 1;
	}
	return 0;
}


int main()
{
	citire();
	qsort(ord1,n+1,sizeof(int),cmp1);
	qsort(ord2,n+1,sizeof(int),cmp2);	

	int rez = search();
	reconst = 1;
	verif(rez);
	printf("%d\n",rez);
	for (int i = 1; i <= n; i++) printf("%d %d\n",tmpa[i] , tmpb[i] );
	return 0;
}