Cod sursa(job #2488484)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 6 noiembrie 2019 22:52:07
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

const int NMAX = 105;
const int INF = 2e9;

struct om_respectabil_nu_betiv{
int a,b;
void print()
{
    printf("%d %d\n",a,b);
}
};

int n , L;
int dp[NMAX][NMAX];
om_respectabil_nu_betiv v[NMAX];
om_respectabil_nu_betiv m[NMAX][NMAX];
om_respectabil_nu_betiv cm[NMAX][NMAX];
vector<om_respectabil_nu_betiv>sol;

inline void dezintoxicare();
inline void bea_cat_mai_mult(int timp);
inline void cpy();

int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    int a , b;
    scanf("%d%d",&n,&L);
    for(int i = 1 ; i <= n ; i++)
    {
        scanf("%d%d",&a,&b);
        om_respectabil_nu_betiv temp;
        temp.a = a;
        temp.b = b;
        v[i] = temp;
    }
    int st,dr,med;
    int ans = -1;
    st = 1;
    dr = 100;
    while(st <= dr)
    {
        med = (st+dr)/2;
        dezintoxicare();
        bea_cat_mai_mult(med);
        if(dp[n][L] >= L)
        {
            dr = med-1;
            ans = med;
            cpy();
        }
        else
            st = med+1;
    }
    printf("%d\n",ans);
    while(n && L >= 0)
    {
        om_respectabil_nu_betiv temp = cm[n][L];
        sol.push_back(temp);
        n--;
        L -= cm[n][L].a;
    }
    reverse(sol.begin(),sol.end());
    for(int i = 0 ; i < sol.size() ; i++)
        sol[i].print();
    return 0;
}

inline void dezintoxicare()
{
    for(int i = 0 ; i <= n ; i++)
        for(int j = 0 ; j <= L ; j++)
            dp[i][j] = -INF;
}

inline void bea_cat_mai_mult(int timp)
{
    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++)
            {
                if(dp[i-1][j-x] == -INF)
                    continue;
                if(v[i].a*x > timp)
                    continue;
                int lb = (timp-v[i].a*x)/v[i].b;
                if(dp[i][j] < dp[i-1][j-x] + lb)
                {
                    dp[i][j] = dp[i-1][j-x] + lb;
                    m[i][j].a = x;
                    m[i][j].b = lb;
                }
            }
        }
    }
}

inline void cpy()
{
    for(int i = 1 ; i <= n ; i++)
        for(int j = 0 ; j <= L ; j++)
            cm[i][j] = m[i][j];
}