Cod sursa(job #1737576)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 4 august 2016 14:12:44
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <algorithm>
#define INF 1000000000
using namespace std;
ifstream fi("lapte.in");
ofstream fo("lapte.out");
typedef struct vit{int a, b;} VIT;
VIT A[101];
int S[101][101],R[101][101],n,l,i,t;

int verif(int x)
{
    int i,j,k,maxa,maxb;
    for(i=0; i<=n; i++)
    {
        for(j=1; j<=l; j++)
        {
            R[i][j]=-INF;
        }
        R[i][0]=0;
    }
    for(i=1; i<=n; i++)
    {
        maxa=x/A[i].a;
        for(j=0; j<=min(l,maxa); j++)
        {
            maxb=(x-j*A[i].a)/A[i].b;
            for(k=l; k>=j; k--)
            {
                if(R[i][k]<(R[i-1][k-j]+maxb))
                {
                    R[i][k]=R[i-1][k-j]+maxb;
                    S[i][k]=j;
                }
            }
        }
    }
    return R[n][l]>=l;
}

int bs()
{
    int st=0;
    int dr=100;
    int rez=-1;
    int mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verif(mij))
        {
            rez=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return rez;
}

void reconst(int poz, int ltr)
{
    if(poz==0)
        return;
    reconst(poz-1, ltr-S[poz][ltr]);
    fo<<S[poz][ltr]<<" "<<(t-A[poz].a*S[poz][ltr])/A[poz].b<<"\n";
}

int main()
{
    fi>>n>>l;
    for(i=1; i<=n; i++)
    {
        fi>>A[i].a>>A[i].b;
    }
    t=bs();
    verif(t);
    fo<<t<<"\n";
    reconst(n,l);
    fi.close();
    fo.close();
    return 0;
}