Cod sursa(job #1778934)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 14 octombrie 2016 15:13:24
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MaxN 205

using namespace std;

FILE *IN,*OUT;
int N,L,T,OX;
struct _Din
{
    int f,val;
}D[MaxN][MaxN];
struct _Drink
{
    int A,B;
}v[MaxN];
bool GetMax(int val)
{
    bool found=false;
    int X,Y;
    memset(D,0,sizeof D);
    D[0][0].val=1;
    D[0][0].f=-1;
    for(int k=1;k<=N;k++)
    {
        for(int i=L;i>=0;i--)
            if(D[k-1][i].val)
            {
                X=val/v[k].A+1;
                while(X)
                {
                    X--;
                    Y=(val-X*v[k].A)/v[k].B;
                    if(!D[k][i+X].val)
                    {
                        D[k][i+X]=D[k-1][i+X];
                        if(D[k][i+X].val<D[k-1][i].val+Y)
                            D[k][i+X].val=D[k-1][i].val+Y,D[k][i+X].f=i;
                        if(i+X>=L&&D[k][i+X].val>L)
                            OX=i+X,found=true;
                    }
                }
            }
    }
    return found;
}
int main()
{
    IN=fopen("test.in","r");
    OUT=fopen("test.out","w");

    fscanf(IN,"%d%d",&N,&L);
    for(int i=1;i<=N;i++)
        fscanf(IN,"%d%d",&v[i].A,&v[i].B);
    int hi=100,lw=1,mid;
    while(hi>=lw)
    {
        mid=(hi+lw)>>1;
        if(GetMax(mid))
        {
            T=mid,hi=mid-1;
        }
        else lw=mid+1;
    }
    fprintf(OUT,"%d",T);
    return 0;
}