Cod sursa(job #766555)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 11 iulie 2012 16:18:41
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

struct ins
{
    int a,b,nr,a1,b1;
};

ins x[111];
int l,n;
int t;

bool cmp1(ins x,ins y)
{
    return (double)t/x.a-(double)t/x.b>(double)t/y.a-(double)t/y.b;
    //return x.a*y.b<y.a*x.b;
}

bool cmp2(ins x,ins y)
{
    return x.nr<y.nr;
}

bool ok(int timp)
{
    int la=l,lb=l,i=1;
    while(i<=n && la)
    {
        if(la<timp/x[i].a)
        {
            x[i].a1=la;
            x[i].b1=(timp-la*x[i].a)/x[i].b;
            lb-=(timp-la*x[i].a)/x[i].b;
            ++i;
            la=0;
            break;
        }
        la-=timp/x[i].a;
        x[i].a1=timp/x[i].a;
        x[i].b1=0;
        ++i;
    }
    while(i<=n && lb>0)
    {
        lb-=timp/x[i].b;
        x[i].a1=0;
        x[i].b1=timp/x[i].b;
        ++i;
    }
    for(i++;i<=n;++i)
        x[i].a1=x[i].b1=0;
    if(la<=0 && lb<=0)
        return true;
    return false;
}


int cauta()
{
    int i,pas=1<<13;
    for(i=0;pas;pas/=2)
    {
        if(!ok(i+pas))
            i+=pas;
    }
    if(ok(i+1))
        return i+1;
}


int main()
{
    int i;
    in>>n>>l;
    for(i=1;i<=n;++i)
    {
        in>>x[i].a>>x[i].b;
        x[i].nr=i;
    }
    sort(x+1,x+n+1,cmp1);
    out<<cauta()<<"\n";
    sort(x+1,x+n+1,cmp2);
    for(i=1;i<=n;++i)
        out<<x[i].a1<<" "<<x[i].b1<<"\n";
    return 0;
}