Cod sursa(job #1120016)

Utilizator misinozzz zzz misino Data 24 februarie 2014 21:11:29
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#define N 110
#define vit pair<pair<int,int>,int>
#define a first.first
#define b first.second
#define p second
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int i,li,l,n,ls,mij,sol;
vit v[N],rez[N];
inline bool verif(int x)
{
    memset(rez,0,sizeof(rez));
    int la=0,lb=0,i=1;
    while(i<=n&&la<l)
    {
        if(la+x/v[i].a>l)
        {
            rez[v[i].p].a=l-la;
            lb=(x-((l-la)*v[i].a))/v[i].b;
            la=l;
            rez[v[i].p].b=lb;
        }
        else
        {
            rez[v[i].p].a=x/v[i].a;
            la+=rez[v[i].p].a;
        }
        ++i;
    }
    while(i<=n&&lb<l)
    {
        if(lb+x/v[i].b>l)
        {
            rez[v[i].p].b=l-lb;
            return 1;
        }
        else
        {
            rez[v[i].p].b=x/v[i].b;
            lb+=rez[v[i].p].b;
        }
        ++i;
    }
    if(lb>=l)
    return 1;
    return 0;
}
inline bool cmp(vit x,vit y)
{
    return x.a-x.b<y.a-y.b;
}
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=10000;
    while(li<=ls)
    {
        mij=(li+ls)>>1;
        if(verif(mij))
        {
            ls=mij-1;
            sol=mij;
        }
        else
        {
            li=mij+1;
        }
    }
    g<<sol<<'\n';
    verif(sol);
    for(i=1;i<=n;++i)
    g<<rez[i].a<<' '<<rez[i].b<<'\n';
    return 0;
}