Cod sursa(job #1892253)

Utilizator antanaAntonia Boca antana Data 24 februarie 2017 20:39:16
Problema Lapte Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia14-cautare_binara Marime 1.39 kb
#include <cstdio>
#define MAX 100
 
int d[MAX+1][2*MAX+1], a[MAX+1], b[MAX+1], last, l, n, r[MAX+1][2*MAX+1];
 
inline int dinamica(int t)
{
    int i, j, k, f=0;
    for(j=0;j<=n;++j)
        for(i=0;i<=2*l;++i)
            d[j][i]=-1, r[j][i]=-1;
 
    d[0][0]=0;
    for(i=1;i<=n;++i)
        for(j=0;j<=2*l;++j)
            for(k=0;k<=j && t-k*a[i]>=0;++k)
                if(d[i-1][j-k] > -1 && d[i][j] < d[i-1][j-k]+(t-k*a[i])/b[i])
                {
                    d[i][j]=d[i-1][j-k]+(t-k*a[i])/b[i];
                    r[i][j]=j-k;
                }
 
    for(i=l;i<=2*l && !f;++i)
        if(d[n][i] >= l)
            f=i;
 
    return f;
}
 
void afisare(int lin, int col)
{
    int x, y;
    if(r[lin][col]!=-1 && lin-1>=1)
        afisare(lin-1, r[lin][col]);
 
    x=col-r[lin][col];
    y=(last-(x*a[lin]))/b[lin];
 
    printf("%d %d\n", x, y);
}
 
int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
 
    int i, st, dr, m, sol;
 
    scanf("%d%d", &n, &l);
 
    for(i=1;i<=n;++i)
        scanf("%d%d", &a[i], &b[i]);
 
    st=1, dr=MAX;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(dinamica(m))
        {
            last=m;
            dr=m-1;
        }
        else st=m+1;
    }
 
    sol=dinamica(last);
 
    printf("%d\n", last);
 
    afisare(n, sol);
 
    return 0;
}