Cod sursa(job #586272)

Utilizator FlorianFlorian Marcu Florian Data 30 aprilie 2011 14:20:18
Problema Fabrica Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 1.31 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 );
		p = ok( ty, NrB, m-1);
		if( p && !r )
		{
			tB = m;
			break;
		}
		else if( p && r ) dr = m - 1;
		else st = m + 1;
	}
	out << tA + tB;
	return 0;
}