Cod sursa(job #931130)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 27 martie 2013 23:56:59
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<cstdio>
#include<cstring>
#define NMax 120
using namespace std;

int D[NMax][NMax],A[NMax],N,L;
int B[NMax],rcst[NMax][NMax];

int check (int T)
{
    int i,j,k;
    memset(D,-1,sizeof(D));
    D[0][0]=0;
    for (i=1; i<=N; i++)
        for (j=0; j<=L; j++)
            for (k=0; k*B[i]<=L && k<=j; k++)
                if (D[i-1][j-k]!=-1 && (D[i-1][j-k]+(T-k*B[i])/A[i])>D[i][j])
                {
                    D[i][j]=D[i-1][j-k]+(T-k*B[i])/A[i];
                    rcst[i][j]=j-k;
                }
    return (D[N][L]>=L);
}

void afisare (int i, int j)
{
    if (!i) return;
    afisare (i-1,rcst[i][j]);
    printf("%d %d\n",D[i][j]-D[i-1][rcst[i][j]],j-rcst[i][j]);
}

int main ()
{
    int lo,hi,mid,i,sol;
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d%d",&N,&L);
    for (i=1; i<=N; i++)
        scanf("%d%d",&A[i],&B[i]);
    lo=1, hi=100;
    while (hi-lo>1)
    {
        mid=(lo+hi)/2;
        if (check(mid))
            hi=mid;
        else
            lo=mid+1;
    }
    if (lo && check(lo))
        sol=lo;
    else
    {
        check(hi);
        sol=hi;
    }
    printf("%d\n",sol);
    afisare(N,L);
    return 0;
}