Cod sursa(job #2615769)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 15 mai 2020 14:45:19
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
	
#define maxim 103
	
#define inf 1<<30
	
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 litri de lapte A
	
int sol[maxim][maxim];
	
 
	
bool dinamica(int ans)
	
{
	
    for(int i = 0; i <= n; i++)
	
        for(int j = 0; j <=l; j++)
	
            dp[i][j] = -inf;
	
 
	
    dp[0][0] = 0;
	
    for (int i=1;i<=n;i++)
	
        for (int j=0; j<=l ;j++)
	
            for (int x=0; x<=j ;x++)  // cati litri 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=100;
	
   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);
	
 
	
}