Cod sursa(job #585833)

Utilizator robigiirimias robert robigi Data 30 aprilie 2011 12:06:50
Problema Fabrica Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.4 kb
#include <cstdio>

using namespace std;

FILE *f=fopen("fabrica.in", "r");
FILE *g=fopen("fabrica.out", "w");

int n, nra, nrb;
int va[50001], vb[50001];
int sola, solb;

inline void swape(int &a, int &b)
{
    int h=a; a=b; b=h;
}

void read()
{
    fscanf(f, "%d%d%d", &n, &nra, &nrb);

    for (int i=1; i<=nra; ++i)
        fscanf(f, "%d", &va[i]);
    for (int j=1; j<=nrb; ++j)
        fscanf(f, "%d", &vb[j]);
}

void quicksort(int lo, int hi, int a[])
{
    int x=a[(lo+hi)/2];
    int i=lo, j=hi;

    do
    {
        while (a[i]<x) ++i;
        while (a[j]>x) --j;

        if (i<=j)
        {
            swape(a[i], a[j]);
            ++i; --j;
        };
    }while (i<=j);

    if (i<hi) quicksort(i, hi, a);
    if (j>lo) quicksort(lo, j, a);
}

int numar(int x)
{
    int nr=0;
    for (int i=1; i<=nra && x/va[i];++i)
    {
        nr+=x/va[i];
    }
    return nr;
}

void cautbin(unsigned int lo, unsigned int hi)
{
    unsigned int x=(lo+hi)/2;

    int cv1=numar(x);

    if (cv1<=n)
    {
        int cv2=numar(x+1);
        if (cv2>=n)
            sola=cv1;
        else cautbin(x+1, hi);
    }
    else cautbin(lo, x);
}

int main()
{
    read();
    quicksort(1, nra, va);
    quicksort(1, nrb, vb);

    cautbin(1, va[1]*n);


    fprintf(g, "%d %d", sola, solb);


    fclose(f);
    fclose(g);

    return 0;
}