Cod sursa(job #783145)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 2 septembrie 2012 12:28:59
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <algorithm>

#define MAX 128

using namespace std;

struct copil
{
    int a, b, ind, ca, cb;
}v[MAX];

int l, n;

bool cmpL(copil x, copil y)
{
    return (x.a - x.b) < (y.a - y.b);
}

bool cmpI(copil x, copil y)
{
    return x.ind < y.ind;
}

bool ok(int val)
{
    int a = l, b = l, i = 1, timp, canConsume;
    while(a && i <= n)
    {
        v[i].ca = v[i].cb = 0;
        canConsume = val / v[i].a;
        timp = val;
        if(canConsume >= a)
        {
            timp -= v[i].a * a;
            v[i].ca = a;
            a = 0;
            v[i].cb = timp / v[i].b;
            b -= v[i].cb;
        }
        else
        {
            v[i].ca = canConsume;
            timp -= v[i].a * v[i].ca;
            a -= v[i].ca;
            v[i].cb = timp / v[i].b;
            b -= v[i].cb;
        }
        i++;
    }
    for(; i <= n; i++)
    {
        v[i].cb = val / v[i].b;
        b -= v[i].cb;
    }
    if(a <= 0 && b <= 0) return true;
    return false;
}

int getResult()
{
    int l = 0, r = 256, m, sol;
    while(l <= r)
    {
        m = (l + r) >> 1;
        if(ok(m))
        {
            sol = m;
            r = m - 1;
        }
        else
            l = m + 1;
    }
    if(ok(sol))
        return sol;
}

int main()
{
    ifstream in("lapte.in");
    in>>n>>l;
    for(int i = 1; i <= n; i++)
    {
        in>>v[i].a>>v[i].b;
        v[i].ind = i;
    } in.close();
    sort(v + 1, v + n + 1, cmpL);
    ofstream out("lapte.out");
    out<<getResult()<<"\n";
    sort(v + 1, v + n + 1, cmpI);
    for(int i = 1; i <= n; i++)
        out<<v[i].ca<<" "<<v[i].cb<<"\n";
    return 0;
}