Cod sursa(job #885313)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 21 februarie 2013 20:13:12
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,i,ls,sol,mij,li;
struct cp{int a,b,p;};
cp v[110],rez[110];
bool cmp(cp a,cp b)
{
    return a.a-a.b<b.a-b.b;
}
bool verif(int x)
{
    int c=1,l1=0,l2=0;
    for(int i=1;i<=n;++i)
    rez[i].a=0,rez[i].b=0;
    while(c<=n&&l1<l)
    {
        if(l1+x/v[c].a>=l)
        {
            rez[v[c].p].a=l-l1;
            l2=(x-(l-l1)*v[c].a)/v[c].b;
            rez[v[c].p].b=l2;
            ++c;
            break;
        }
        l1+=x/v[c].a;
        rez[v[c].p].a=x/v[c].a;
        ++c;
    }
    while(c<=n&&l2<l)
    {
        l2+=x/v[c].b;
        rez[v[c].p].b=x/v[c].b;
        ++c;
    }
    return l2>=l;
}
int main()
{
    f>>n>>l;
    for(i=1;i<=n;++i)
    {
        f>>v[i].a>>v[i].b;
        v[i].p=i;
    }
    sort(v+1,v+n+1,cmp);
    li=0;
    ls=1<<15
    ;
    while(li<=ls)
    {
        mij=(li+ls)>>1;
        if(verif(mij))
        ls=mij-1,sol=mij;
        else
        li=mij+1;
    }
//    ++sol;
    verif(sol);
    g<<sol<<'\n';
    for(i=1;i<=n;++i)
    g<<rez[i].a<<' '<<rez[i].b<<'\n';
    return 0;
}