Cod sursa(job #28404)

Utilizator marinaMarina Horlescu marina Data 7 martie 2007 19:51:14
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
//029 Lapte - solutie greedy euristic & cautare binara nlog n
#include <stdio.h>
#include <stdlib.h>
#define INPUT "lapte.in"
#define OUTPUT "lapte.out"
#define MAX 101
int N, L, T;
struct pers
{
	int ta, tb, n_ord;
}v[MAX];
int comp(const void *a, const void *b)
{
	if( (((pers*)a)->ta) * (((pers*)b)->tb) > (((pers*)b)->ta) * (((pers *)a)->tb)) return 1;
	return -1;
}
int OK(int tmax)
{
	int i, la = 0, lb = 0, t;
	for(i = 1; i <= N; ++i)
	{
		if(la < L)
		{
			if(L-la < tmax/v[i].ta) 
				t = tmax-v[i].ta*(L-la),
				la = L;
			else la += tmax/v[i].ta	,
				t = tmax %v[i].ta;
		}
		else t = tmax;
		lb += t/v[i].tb;
		if(la >= L && lb >= L) return 1;
	}

	return 0;
}
int main()
{
	freopen(INPUT, "r", stdin);
	scanf("%d %d", &N, &L);
	int i;
	for(i = 1; i <= N; ++i)
		scanf("%d %d", &v[i].ta, &v[i].tb),
		v[i].n_ord = i;
	qsort(v+1, N, sizeof(v[0]), comp);
	
	int in = 0, sf = MAX, mij;
	while(in < sf)
	{
		mij = (in + sf)/2;
		if( OK(mij) ) sf = mij;
		else in = mij + 1;
	}
	
	freopen(OUTPUT, "w", stdout);
	printf("%d", in);
	return 0;
}