Pagini recente » Cod sursa (job #2239548) | Cod sursa (job #2351691) | Cod sursa (job #1082955) | Cod sursa (job #1855657) | Cod sursa (job #585982)
Cod sursa(job #585982)
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
#define Pmax 50005
#define Nmax 200002
int N, NA, NB, TA, TB;
int A[Pmax], B[Pmax];
int T[Nmax];
priority_queue< pair<int,int> > H;
inline int max(int a, int b) { return a>b?a:b; }
void timpA()
{
int i, p, aux, nr;
for (i=0, p=1; i<29; ++i, p<<=1);
while (p)
{
aux = TA + p;
p >>= 1;
for (i=nr=0; i<NA; ++i)
nr += aux / A[i];
if (nr<N) TA = aux;
}
++TA;
for (i=nr=0; i<NA; ++i)
for (p=1; p*A[i]<=TA; ++p)
T[nr++] = p*A[i];
sort(T, T+nr);
}
void timpB()
{
int i, p, aux, start;
pair<int,int> who;
for (i=0, p=1; i<29; ++i, p<<=1);
while (p)
{
aux = TB + p;
p >>= 1;
//goleste heapul
while (! H.empty() ) H.pop();
//baga in heap
for (i=0; i<NB; ++i)
if (B[i] <= aux) H.push( make_pair(0, B[i]) );
for (i=0; i<N; ++i)
{
if (H.empty()) break;
who = H.top();
start = max(T[i], -who.first);
H.pop();
if (start + who.second > aux) { --i; continue; }
if (start + 2*who.second <= aux) H.push( make_pair(-(start + who.second), who.second) );
}
if (i<N) TB = aux;
}
++TB;
}
int main()
{
int i;
freopen("fabrica.in","r",stdin);
freopen("fabrica.out","w",stdout);
scanf("%d %d %d", &N, &NA, &NB);
for (i=0; i<NA; ++i)
scanf("%d", &A[i]);
for (i=0; i<NB; ++i)
scanf("%d", &B[i]);
timpA();
printf("%d ", TA);
timpB();
printf("%d\n", TB);
return 0;
}