Cod sursa(job #2427852)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 2 iunie 2019 14:29:55
Problema Lapte Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <algorithm>
#define MAX 100

using namespace std;

struct lapte
{
    int a;
    int b;
    int poz;
}v[MAX], cant[MAX], cantMin[MAX];

bool cmp(lapte a, lapte b)
{
    if(a.a == b.a && a.b > b.b)return true;
    else if(a.a < b.a)return true;
    return false;
}

bool cmpPoz(lapte a, lapte b)
{
    if(a.poz < b.poz)return true;
    return false;
}

bool solve(int N, int L, int T)
{
    int cantA, cantB, i;

    cantA = cantB = 0;
    for(i = 0; i < N; i++)
    {
        cant[i].poz = v[i].poz;
        if(cantA + T / v[i].a < L)
        {
            cantA += T / v[i].a;

            cant[i].a = T / v[i].a;
            cant[i].b = 0;
        }
        else{
            int dif = L - cantA;

            int rest = T - dif * v[i].a;

            cantA = L;
            cantB += rest / v[i].b;

            cant[i].a = dif;
            cant[i].b = rest / v[i].b;
        }
    }

    if(cantA == L && cantB >= L)return true;
    return false;
}

int main()
{
    int n, l, i, st, dr, mij, gasit;

    ifstream fin("lapte.in");
    ofstream fout("lapte.out");

    fin >> n >> l;

    for(i = 0; i < n; i++)
    {
        fin >> v[i].a >> v[i].b;
        v[i].poz = i;
    }

    sort(v, v + n, cmp);

    st = 1;
    dr = MAX;

    while(st <= dr)
    {
        mij = (st + dr) / 2;

        if(solve(n, l, mij))
        {
            sort(cant, cant + n, cmpPoz);
            for(i = 0; i < n; i++)
            {
                cantMin[i].a = cant[i].a;
                cantMin[i].b = cant[i].b;
            }

            gasit = mij;
            dr = mij - 1;
        }
        else st = mij + 1;
    }

    fout << gasit << '\n';

    for(i = 0; i < n; i++)fout << cantMin[i].a << " " << cantMin[i].b << '\n';

    fin.close();
    fout.close();

    return 0;
}