Cod sursa(job #2432916)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 25 iunie 2019 14:31:59
Problema Lapte Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
#define maxim 103

using namespace std;

/*
ifstream f("../dt.in");
ofstream g("../dt.out");
*/

ifstream f("lapte.in");
ofstream g("lapte.out");

pair <int , int > betivi[maxim];
int n,l;
int dp[maxim][maxim]; // max. de litri de lapte B bauti de primii i oameni , stiind ca s- au baut j litrii de lapte A
int sol[maxim][maxim];

bool dinamica(int ans)
{
    memset(dp,-1, sizeof(dp));

    for (int i=0 ;i<=l ;i++)
        dp[1][i]=(ans-i*betivi[1].first)/betivi[1].second;

    for (int i=2;i<=n;i++)
        for (int j=0; j<=l ;j++)
            for (int x=0; x<=j ;x++)  // cati litrii au baut inaintea lui
            {
                int b=(j-x)*betivi[i].first;
                if (b<=ans)
                {
                    int plus=(ans-b)/betivi[i].second;
                    if (dp[i][j]< dp[i-1][x]+plus)
                    {
                        dp[i][j]=dp[i-1][x]+plus;
                        sol[i][j]=x;
                    }

                }

            }

    return (dp[n][l]>=l);
}
int a=0, b=0;
void rep(int i,int x)
{
    if (i==1)
    {
        g<<x<<" "<<dp[1][x]<<'\n';
        a+=x;
        b+=dp[1][x];
        return;
    }
    rep(i-1,sol[i][x]);
    g<<x-a<<" "<<dp[i][x]-b<<'\n';
    a+=x-a;
    b+=dp[i][x]-b;
}

int main()
{
    f>>n>>l;
    for (int i=1;i<=n;i++)
        f>>betivi[i].first>>betivi[i].second;
   //bs
   int i=1,j=101;
   while (i<=j)
   {
       int m=(i+j)/2;
       if (dinamica(m))
         j=m-1;
       else i=m+1;
   }
   g<<i<<'\n';
   dinamica(i);
   rep (n,l);

}