Cod sursa(job #2007044)

Utilizator Coroian_DavidCoroian David Coroian_David Data 1 august 2017 18:29:54
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.21 kb
#include <cstdio>

#include <algorithm>

using namespace std;

FILE *f, *g;

int n, mk;

struct beutor
{
    int a, b, tleft, luatb, luata, i;

    int afb, afa;
};

beutor v[109];

void readFile()
{
    f = fopen("lapte.in", "r");

    fscanf(f, "%d%d", &n, &mk);

    int i;
    for(i = 1; i <= n; i ++)
        fscanf(f, "%d%d", &v[i].a, &v[i].b), v[i].i = i;

    fclose(f);
}

bool pos(int t)
{
    ///v[i].c = cat a castigam daca pierdem un b
    int i, a = 0, b = 0;
    for(i = 1; i <= n; i ++)
    {
        b += t / v[i].b;

        v[i].luatb = t / v[i].b;

        v[i].tleft = t % v[i].b;


        a += v[i].tleft / v[i].a;

        v[i].luata = v[i].tleft / v[i].a;

        v[i].tleft %= v[i].a;
    }

   // printf("%d \n", t);

    if(a >= mk && b >= mk)
        return 1;

   // printf("%d \n", t);

    int aa = a;
    int ab = b;
    for(i = 1; i <= n; i ++)
    {

    //    printf("%d %d %d  %d %d\n", i, v[i].a, v[i].b, a, b);
        int cl = v[i].tleft;

        b -= v[i].luatb;

        v[i].tleft += v[i].luatb * v[i].b;


        a += v[i].tleft / v[i].a;

        v[i].tleft %= v[i].a;



        b += v[i].tleft / v[i].b;

        v[i].tleft %= v[i].b;

//        printf("%d %d %d  %d %d\n", i, v[i].a, v[i].b, a, b);


        if(a >= mk && b >= mk)
            return 1;


//    printf("%d \n", t);

        if(b < mk)
        {
            if(a >= mk)
            {
                b = ab;
                a = aa;

                int j;
                for(j = 1; j <= v[i].luatb; j ++)
                {
                    v[i].tleft = cl;

                    b -= j;

                    v[i].tleft += j * v[i].b;

                    a += v[i].tleft / v[i].a;

                    v[i].tleft %= v[i].a;



                    b += v[i].tleft / v[i].b;

                    v[i].tleft %= v[i].b;


                    if(a >= mk && b >= mk)
                        return 1;
                }

                return 0;
            }
        }

        aa = a;
        ab = b;
    }

    return 0;
}

int cautBin()
{
    int i = 0;
    int pas = 1 << 7;
    while(pas != 0)
    {
        if(pos(i + pas) == 0)
            i += pas;

        pas /= 2;
    }

    return i + 1;
}

bool cmp(beutor c, beutor d)
{
    return (c.b * d.a > c.a * d.b);
}

int rez;

void solve()
{
    sort(v + 1, v + n + 1, cmp);

    rez = cautBin();
}

bool cmpi(beutor a, beutor b)
{
    return a.i < b.i;
}

void printAll()
{
    sort(v + 1, v + n + 1, cmpi);

    int i;
    for(i = 1; i <= n; i ++)
        fprintf(g, "%d %d\n", v[i].afa, v[i].afb);
}

void afis(int t)
{
    //printf("AFISAM\n");

     ///v[i].c = cat a castigam daca pierdem un b
    int i, a = 0, b = 0;
    for(i = 1; i <= n; i ++)
    {
        b += t / v[i].b;

        v[i].luatb = t / v[i].b;

        v[i].tleft = t % v[i].b;


        v[i].afb = t / v[i].b;

        a += v[i].tleft / v[i].a;

        v[i].luata = v[i].tleft / v[i].a;


        v[i].afa = v[i].luata;


        v[i].tleft %= v[i].a;
    }

   // printf("%d \n", t);

    if(a >= mk && b >= mk)
        {
            printAll();

            return;
        }

  //  printf("%d \n", t);

    int aa = a;
    int ab = b;
    for(i = 1; i <= n; i ++)
    {
        int oldb = v[i].afb;
        int olda = v[i].afa;

       // printf("%d %d %d  %d %d\n", i, v[i].a, v[i].b, a, b);
        int cl = v[i].tleft;

        v[i].afb = 0;


        b -= v[i].luatb;

        v[i].tleft += v[i].luatb * v[i].b;


        a += v[i].tleft / v[i].a;

        v[i].afa += v[i].tleft / v[i].a;

        v[i].tleft %= v[i].a;



        b += v[i].tleft / v[i].b;

        v[i].afb += v[i].tleft / v[i].b;

        v[i].tleft %= v[i].b;

       // printf("%d %d %d  %d %d\n", i, v[i].a, v[i].b, a, b);


    if(a >= mk && b >= mk)
        {
            printAll();

            return;
        }


//    printf("%d \n", t);

        if(b < mk)
        {
            if(a >= mk)
            {
                b = ab;
                a = aa;

                v[i].afb = oldb;
                v[i].afa = olda;

                int j;
                for(j = 1; j <= v[i].luatb; j ++)
                {
                    v[i].tleft = cl;

                    b -= j;

                    v[i].afb -= j;

                    v[i].tleft += j * v[i].b;

                    a += v[i].tleft / v[i].a;

                    v[i].afa += v[i].tleft / v[i].a;

                    v[i].tleft %= v[i].a;



                    b += v[i].tleft / v[i].b;

                    v[i].afb += v[i].tleft / v[i].b;

                    v[i].tleft %= v[i].b;


    if(a >= mk && b >= mk)
        {
            printAll();

            return;
        }
                }

                return ;
            }
        }

        aa = a;
        ab = b;
    }

    return ;
}

void printFile()
{
    g = fopen("lapte.out", "w");

    fprintf(g, "%d\n", rez);

    afis(rez);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}