Pagini recente » Borderou de evaluare (job #2783229) | Cod sursa (job #414209) | Cod sursa (job #2391802) | Borderou de evaluare (job #348515) | Cod sursa (job #586272)
Cod sursa(job #586272)
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;
}