Cod sursa(job #588453)

Utilizator FlorianFlorian Marcu Florian Data 8 mai 2011 00:20:17
Problema Fabrica Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
using namespace std;
#include<fstream>
#include<cstdio>
const int MAX_N = 100007;
int N, NrA, NrB, mn , mx;
int tx[MAX_N], ty[MAX_N];
const int oo = 0x3f3f3f3f;

int ok(int t[], int n,  int T )
{
	int sol = 0;
	for(int i = 1; i <= n; ++i ) sol += (T/t[i]);
	return (sol >= N);
}

int main()
{
	ifstream in("fabrica.in"); ofstream out("fabrica.out");

    in >> N >> NrA >> NrB;

	int st, dr, m, i, tA = oo, tB = oo, r, p;
	for(i = 1; i <= NrA; ++i) in >> tx[i];
	for(i = 1; i <= NrB; ++i) in >> ty[i];

	st = 0; dr = oo;
	while( st <= dr )
	{
		m = (st + dr)>>1;
		r = ok(tx, NrA, m), p = ok(tx, NrA, m-1);
		if( r && !p )
		{
			tA = m;
			break;
		}
		else if( r && p ) dr = m - 1;
		else st = m + 1;
	}
	
	//printf("%d ", tA );
    out << tA << " ";

	for(i = 1, mn = oo; i <= NrA; ++i )
	{
	    if( mn > tx[i] + 1 ) mn = ( tx[i] ) + 1;
	    if( mx < (tA/tx[i]) * tx[i] + 1 ) mx = ( tA/tx[i] ) * tx[i] + 1 ;
	}   
	
   // printf(" ( %d %d )", mx, mn );
	int dif = mx - mn;

    if( dif < 0 ) dif = 0;
	
	for(i = 1; i <= NrB; ++i)
	    N -= (int)( dif/ty[i] );
    
	if( N < 0 ) N = 0;

	st = 0; dr = oo;
    //printf(" %d", N);
	while( st <= dr )
	{
		m = ( st + dr ) >> 1;
		r = ok( ty, NrB, m );
		if(m > 0 )p = ok( ty, NrB, m-1);
		else p  = 0;
		if( r && !p  )
		{
			tB = m;
		//	printf(" DSADAS %d ", m );
			break;
		}
		else if( p && r ) dr = m - 1;
		else st = m + 1;
	}
	out << tA + tB;
	return 0;
}