Cod sursa(job #766547)

Utilizator ioanabIoana Bica ioanab Data 11 iulie 2012 16:03:23
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const int N=105;
int n,l;

struct point
{
    int a,b,poz;
};
point x[N],rez[N];

bool cmp(point x, point y)
{
    return x.a-x.b < y.a-y.b;
}


bool ok(int t)
{
    int la=0,lb=0,k;
    k=1;

    while(k<=n && la<l)
    {
        la+=t/x[k].a;
        rez[x[k].poz].a=t/x[k].a;
        k++;
    }

    lb+=((la-l)*x[k-1].a)/x[k-1].b;
    rez[x[k-1].poz].a=(t-lb*x[k-1].b)/x[k-1].a;
    rez[x[k-1].poz].b=lb;

    while(k<=n)
    {
        lb+=t/x[k].b;
        rez[x[k].poz].b=t/x[k].b;
        k++;
    }

    if(lb>=l)
        return true;
    return false;

}



int bs()
{
    int i,pas=1<<7;
    for(i=1;pas;pas>>=1)
    {
        if(i+pas<=N && !ok(i+pas))
            i+=pas;
    }
    return i+1;
}


int main()
{
    int i,t;
    in>>n>>l;
    for(i=1;i<=n;i++)
    {
        in>>x[i].a>>x[i].b;
        x[i].poz=i;
    }

    sort(&x[1],&x[n+1],cmp);
    t=bs();
    out<<t<<"\n";
    i=ok(t);
    for(i=1;i<=n;i++)
        out<<rez[i].a<<" "<<rez[i].b<<"\n";


    return 0;
}