Cod sursa(job #588412)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 7 mai 2011 21:53:07
Problema Fabrica Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
#define nmax 100010

int n, nra, nrb, nr, sol, a[nmax], c[nmax], d[nmax];

int verif(int x)
{
	int i, c=0;
	for (i=1; i<=nr; i++) 
		c+=x/a[i];
	return c>=n;
}

int search(ll st, ll dr)
{
	ll m, r;
	while (st<dr)
	{
		m=(st+dr)/2;
		if (verif(m))
		{
			r=m;
			dr=m-1;
		} else st=m+1;
	}
	return r;
}

int main()
{
	freopen("fabrica.in","r",stdin);
	freopen("fabrica.out","w",stdout);
	scanf("%d %d %d", &n, &nra, &nrb);
	nr=nra;
	ll f, s;
	int i, j, l;
	ll vmax=((1<<30)-1)*2+1;
	f=0;
	for (i=1; i<=nr; i++) 
	{
		scanf("%d", &a[i]);
		if (a[i]>f) f=a[i];
	}
	s=f*n;
	int x=search(1, s);
	printf("%d ",x);
	l=0;
	for (i=1; i<=nr; i++) 
		for (j=a[i]; j<=x; j+=a[i]) c[++l]=j;
	nr=nrb;
	f=vmax;
	for (i=1; i<=nr; i++) 
	{
		scanf("%d", &a[i]);
		if (a[i]<f) f=a[i];
	}
	s=f*n;
	x=search(1, s);
	l=0;
	for (i=1; i<=nr; i++)
		for (j=a[i]; j<=x; j+=a[i]) d[++l]=j;
	sort(c+1, c+n+1);
	sort(d+1, d+n+1);
	for (i=1; i<=n; i++)
		if (c[i]+d[n-i+1]>sol) sol=c[i]+d[n-i+1];
	printf("%d\n",sol);
}