Cod sursa(job #2011630)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 16 august 2017 19:11:52
Problema Lapte Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <stdlib.h>
int a[101][101],x[101],y[101],leg[101][101],la[101],lb[101],l;
int verif(int t,int n)
{
    int i,j,max,p,k;
    for(i=1; i<=n; i++)
        for(j=0; j<=l; j++)
            a[i][j]=leg[i][j]=0;
    for(i=1; i<=n; i++)
        for(j=0; j<=l; j++)
        {
            max=-1;
            p=0;
            for(k=j; k>=0 && i>1; k--)
                if((t-x[i]*(j-k))/y[i]+a[i-1][k]>max && (t-x[i]*(j-k))>=0)
                    max=(t-x[i]*(j-k))/y[i]+a[i-1][k],p=k;
            if(i==1)
                if((t-x[i]*j)/y[i]>max && (t-x[i]*j)>=0)
                    max=(t-x[i]*j)/y[i];
            a[i][j]=max;
            leg[i][j]=j-p;
        }
    if(a[n][l]>=l) return 1;
    return 0;
}
int main()
{
    int n,i,j,pas,ct,k;
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d%d",&n,&l);
    for(i=1; i<=n; i++)
        scanf("%d%d",&x[i],&y[i]);
    //for(i=0; i<=l; i++)
        //a[0][i]=-1000000;
    j=0;
    pas=1<<7;
    while(pas)
    {
        if(verif(j+pas,n)) ;
        else j+=pas;
        pas/=2;
    }
    j++;
    ct=verif(j,n);
    printf("%d\n",j);
    k=l;
    for(i=n; i>0; i--)
    {
        la[i]=leg[i][k];
        k-=leg[i][k];
    }
    for(i=1; i<=n; i++)
        printf("%d %d\n",la[i],(j-la[i]*x[i])/y[i]);

    return 0;
}