Cod sursa(job #586236)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 30 aprilie 2011 14:12:38
Problema Fabrica Scor 12
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.69 kb
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
#define nmax 100010
#define ll long long
#define f first
#define s second

int n, nra, nrb, r, a[nmax], b[nmax], v[nmax], h, sol;
long long s;
multiset <pair <int, int> > st, sb;

int verif(int x)
{
    int i, c=0;
    for (i=1; i<=nra; i++)
        c+=(x/a[i]);
   // printf("%d %d\n",x,c);
    return c>=n;
}

int search(ll st, ll dr)
{
    long long m, r=0;
    while (st<dr)
    {
       // printf("%d\n",r);
        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);
    int i, j, y;
    ll x=1<<30;
    for (i=1; i<=nra; i++)
    {
        scanf("%d",&a[i]);
        if (x>a[i]) x=a[i];
    }
    for (i=1; i<=nrb; i++) scanf("%d",&b[i]);
    sort(a+1, a+nra+1);
    s=(long long)((1<<30)-1)*2+1;
    if (x*nra<s) s=x*n;
   // printf("%d\n",s);
    r=search(1, s);
    for (i=1; i<=nra && h<=n; i++)
        for (j=1; j<=r/a[i] && h<=n; j++)
            v[++h]=j*a[i];
    //for (i=1; i<=n; i++) printf("%d ",v[i]);
   //// printf("\n");
    sort(v+1, v+n+1);
   for (i=1; i<=nrb; i++) sb.insert(make_pair(0, -b[i]));
    //printf("%daaa\n",(*sb.begin()).f);
    for (i=1; i<=n; i++)
    {
        x=-(*sb.begin()).s;
        y=(*sb.begin()).f;
        if (y<v[i]) y=v[i];
        y=y+x;
       // printf("%I64d %d\n",x,y);
        if (y>sol) sol=y;
        sb.erase(sb.begin());
        sb.insert(make_pair(y, -x));
    }

    printf("%d %d",r, sol);
    return 0;
}