Cod sursa(job #2924679)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 8 octombrie 2022 12:30:12
Problema Lapte Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
//Ilie Dumitru
#include<cstdio>
#include<algorithm>

struct om
{
    int a, b, i;

    friend bool operator<(om x, om y) {return x.a*y.b>y.a*x.b;}
};
om v[100];
int N, L;

bool is_enough(int T)
{
    int a=0, b=0, i, x;
    for(i=0;i<N && (a<L || b<L);++i)
    {
        if(b>=L)
            a+=T/v[i].a;
        else
        {
            x=T/v[i].b;
            if(b+x>=L)
            {
                x=L-b;
                a+=(T-x*v[i].b)/v[i].a;
                b=L;
            }
            else
                b+=x;
        }
    }
    return a>=L && b>=L;
}

void gen_sol(int T)
{
    int b=0, i, x;
    om aux;
    for(i=0;i<N;++i)
    {
        if(b>=L)
        {
            v[i].a=T/v[i].a;
            v[i].b=0;
        }
        else
        {
            x=T/v[i].b;
            if(b+x>=L)
            {
                x=L-b;
                v[i].a=(T-x*v[i].b)/v[i].a;
                v[i].b=x;
                b=L;
            }
            else
            {
                b+=x;
                v[i].a=0;
                v[i].b=x;
            }
        }
    }
    for(i=0;i<N;++i)
    {
        while(v[i].i!=i)
        {
            aux=v[i];
            v[i]=v[aux.i];
            v[aux.i]=aux;
        }
    }
}

int main()
{
    FILE* f=fopen("lapte.in", "r"), *g=fopen("lapte.out", "w");
    int i, l, r, m;

    fscanf(f, "%d%d", &N, &L);
    for(i=0;i<N;++i)
        fscanf(f, "%d%d", &v[i].a, &v[i].b), v[i].i=i;
    fclose(f);

    std::sort(v, v+N);
    l=0;
    r=101;
    while(r-l>1)
    {
        m=(l+r)>>1;
        if(is_enough(m))
            r=m;
        else
            l=m;
    }

    fprintf(g, "%d\n", r);
    gen_sol(r);
    for(i=0;i<N;++i)
        fprintf(g, "%d %d\n", v[i].a, v[i].b);
    fclose(g);

    return 0;
}