Cod sursa(job #837386)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 17 decembrie 2012 22:20:33
Problema Lapte Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;
int n,l,a[110],b[110],c[110][110],poz[110][110],minim,t;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

void afisare (int x,int y)
{
    if(x==0) ;
    else{
        afisare(x-1,poz[x][y]);
        fout<<y-poz[x][y]<<" "<<c[x][y]-c[x-1][poz[x][y]]<<"\n";
    }
}
int bun(int x)
{
    for(int i=0;i<=n;i++)
        for(int j=0;j<=l;j++)
            c[i][j]=-1;
    c[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=l;j++)
        {
            c[i][j]=-1;
            for(int k=0;k<=j;k++)
                if(c[i-1][k] != -1)
                {
                    int aux=(j-k)*a[i];
                    if(aux<=x && c[i][j]<c[i-1][k]+(x-aux)/b[i])
                    {
                        c[i][j]=c[i-1][k]+(x-aux)/b[i];
                        poz[i][j]=k;
                    }
                }
        }
    if(c[n][l]>=l) return 1;
    return 0;
}

int cauta(int st,int dr)
{
    int r=dr+1;
    while(st<dr)
    {
        int m=(st+dr)/2;
        if(bun(m))
        {
            r=m;
            dr=m-1;
        }
        else st=m+1;
    }
    return r;
}
int main()
{
    fin>>n>>l;
    for(int i=1;i<=n;i++)
        fin>>a[i]>>b[i];
    t=cauta(1,100);
    bun(t);
    fout<<t<<'\n';
    afisare(n,l);
    return 0;
}