Cod sursa(job #495015)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 23 octombrie 2010 17:50:12
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <stdio.h>

int l,n,a[101],b[101],ind[101],sol,s[2][101];

int g(int x)
{
    int la=0,lb=0,ok=1;
    int i,j=0;
    for (i=1;i<=n;++i) la+=x/a[i];
    if (la<=l) return 0;
    i=0;
    while ((lb<l)&&(la>l)&&(i<=n))
    {
        ++i;
        la-=x/a[i];
        lb+=x/b[i];
    }
    if ((la>=l)&&(lb>=l)) return 1;
    if (lb>l)
    {
        lb-=x/b[i];
        while ((ok)&&(j<x))
        {
            ++j;
            la+=j/a[i];
            lb+=(x-j)/b[i];
            if (la>=l) ok=0;
            else {la-=j/a[i];lb-=(x-j)/b[i];}
        }
        if ((la>=l)&&(lb>=l)) return 1;
    }
    return 0;
}

int bs(int s,int d)
{
    int mid;
    while (s<d)
    {
        mid=(s+d)/2;
        if (g(mid)<1) s=mid+1;
        else d=mid;
    }
    mid=(s+d)/2;
    if (g(mid)<1) ++mid;
    return mid;
}

void inter(int j)
{
    int aux=a[j];a[j]=a[j-1];a[j-1]=aux;
    aux=b[j];b[j]=b[j-1];b[j-1]=aux;
    aux=ind[j];ind[j]=ind[j-1];ind[j-1]=aux;
}

int main()
{
    int i,j,k,la=0,lb=0,ok=1;
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d%d",&n,&l);
    for (i=1;i<=n;++i) ind[i]=i;
    for (i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
    for (i=2;i<=n;++i)
        for (j=i;j>1;--j)
            if (b[j]+a[j-1]<b[j-1]+a[j]) inter(j);
            else if ((b[j]+a[j-1]==b[j-1]+a[j])&&(b[j]*a[j-1]<b[j-1]*a[j])) inter(j);
    sol=bs(1,20000);
    printf("%d\n",sol);
    for (i=1;i<=n;++i) la+=sol/a[i];
    i=0;
    while ((lb<l)&&(la>l)&&(i<=n))
    {
        ++i;
        la-=sol/a[i];
        lb+=sol/b[i];
    }
    if ((la>=l)&&(lb>=l))
    {
        for (j=1;j<=i;++j) {s[0][ind[j]]=0;s[1][ind[j]]=sol/b[j];}
        for (j=i+1;j<=n;++j) {s[0][ind[j]]=sol/a[j];s[1][ind[j]]=0;}
        for (i=1;i<=n;++i) printf("%d %d\n",s[0][i],s[1][i]);
        return 0;
    }
    lb-=sol/b[i];
    while ((ok)&&(j<sol))
    {
        ++j;
        la+=j/a[i];
        lb+=(sol-j)/b[i];
        if (la>=l) ok=0;
        else {la-=j/a[i];lb-=(sol-j)/b[i];}
    }
    k=j;
    for (j=1;j<i;++j) {s[0][ind[j]]=0;s[1][ind[j]]=sol/b[j];}
    s[0][ind[i]]=k/a[i];s[1][ind[i]]=(sol-k)/b[i];
    for (j=i+1;j<=n;++j) {s[0][ind[j]]=sol/a[j];s[1][ind[j]]=0;}
    for (i=1;i<=n;++i) printf("%d %d\n",s[0][i],s[1][i]);
    return 0;
}