Cod sursa(job #1263779)

Utilizator akaprosAna Kapros akapros Data 15 noiembrie 2014 08:51:44
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,i,j,l,st,dr,m,mx,my,sol;
int p,q,ok,L,k,la,lb;
int a[205][205];
bool A[205][205];
struct nod
{
    int x;
    int y;
}v[205],b[205][205][205];
nod vsol[205];
int La,Lb;
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d %d",&n,&l);
    mx=1000; my=1000; sol=1000000000;
    for (i=1;i<=n;i++)
    {
        scanf("%d %d",&v[i].x,&v[i].y);
        mx=min(mx,v[i].x);
        my=min(my,v[i].y);
    }
    dr=(mx+my)*l;
    st=1;
    while (st<=dr)
    {
        memset(a,0,sizeof(a));
        memset(A,0,sizeof(A));
        ok=0; L=0;
        m=(st+dr)/2; A[0][0]=1;
        for (i=1;i<=n;i++)
        for (k=0;k<=l;k++) if (A[i-1][k])
        for (j=0;j<=m/v[i].x;j++)
        if ((a[i][k+j]<a[i-1][k]+((m-(v[i].x*j))/v[i].y)))
        {
            a[i][k+j]=a[i-1][k]+((m-(v[i].x*j))/v[i].y);
            A[i][k+j]=1;
            b[i][k+j][a[i][k+j]].x=j;
            b[i][k+j][a[i][k+j]].y=((m-(v[i].x*j))/v[i].y);
            if ((k+j>=l)&&(a[i][k+j]>=l))
            {
                ok=1;
                L=k+j;
            }
        }

        if ((ok==1)&&(m<sol))
        {
            sol = m;
            La = L; Lb = a[n][L];
        }

        if (ok) dr=m-1;
        else st=m+1;
    }
    printf("%d\n",sol);
    for (i=n;i>=1;i--)
    {
        la=La; lb=Lb;
        vsol[i].x=b[i][la][lb].x;
        vsol[i].y=b[i][la][lb].y;
        Lb=Lb-b[i][la][lb].y;
        La=La-b[i][la][lb].x;
    }
    for (i=1;i<=n;i++)
    printf("%d %d\n",vsol[i].x,vsol[i].y);
    return 0;
}