Cod sursa(job #1828727)

Utilizator tqmiSzasz Tamas tqmi Data 13 decembrie 2016 20:08:45
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define Tmax 100
#define Nmax 105
#define Lmax 105
#define oo -(1<<30)
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int A[Nmax],B[Nmax],dp[Nmax][Lmax],solm[Nmax][Nmax];
int N,L,sol;
void read()
{
    fin>>N>>L;
    for(int i=1;i<=N;++i)
    {
        fin>>A[i]>>B[i];
    }
}

bool check(int time)
{
    memset(solm,0,sizeof(solm));
    for(int i=0;i<=N;i++)
        for(int j=0;j<=L;j++)
            dp[i][j]=oo;
    dp[0][0]=0;
    for(int i=1;i<=N;i++)
    {
        for(int j=0;j<=L;++j)
        {
            for(int k=0; k<=j && k <= time/A[i] ;++k)
            {
                int milkB=(time-k*A[i])/B[i];
                if(dp[i][j]<dp[i-1][j-k]+milkB)
                {
                    dp[i][j]=dp[i-1][j-k]+milkB;
                    solm[i][j]=k;
                }
            }
        }
    }
    if(dp[N][L]>=L)
        return true;
    return false;
}

void dei(int left,int right)
{
    int mid=(left+right)/2;
    if(left<=right)
    {
        bool ok=check(mid);
        if(ok)
        {
            sol=mid;
            dei(left,mid-1);
        }
        else
            dei(mid+1,right);
    }
}

void solve()
{
    dei(1,Tmax);
}
void pr(int i,int j)
{
    if(i)
    {
        pr(i-1,j-solm[i][j]);
        fout<<solm[i][j]<<" "<<(sol-solm[i][j]*A[i])/B[i]<<"\n";
    }
}
void print()
{
    fout<<sol<<"\n";
    check(sol);
    pr(N,L);
}

int main()
{
    read();
    solve();
    print();
    return 0;
}