Cod sursa(job #2606847)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 28 aprilie 2020 18:54:26
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int NMAX = 100;
const int LMAX = 100;
struct lapte
{
    int a , b;
    lapte(int ta = 0 , int tb = 0)
    {
        a = ta;
        b = tb;
    }
};
lapte v[NMAX + 5] , ans[NMAX + 5];
int d[NMAX + 5][LMAX + 5] , pr[NMAX + 5][LMAX + 5] , n , l;
int verif(int t)
{
    int i , j , k;
    memset(d , -1 , sizeof(d));
    memset(pr , 0 , sizeof(pr));
    d[0][0] = 0;
    for(i = 1 ; i <= n ; i ++)
        for(j = 0 ; j <= l ; j ++)
            for(k = 0 ; k * v[i].a <= t ; k ++)
                if(d[i - 1][j - k] != -1)
                {
                    int b = d[i - 1][j - k] + (t - k * v[i].a) / v[i].b;
                    if(d[i][j] < b)
                    {
                        d[i][j] = b;
                        pr[i][j] = k;
                    }
                }
    if(d[n][l] >= l)
        return 1;
    return 0;
}
void reconstituire(int t)
{
    int i , j;
    for(i = n , j = l ; i >= 1 ; j = j - pr[i][j] , i --)
    {
        ans[i].a = pr[i][j];
        ans[i].b = (t - pr[i][j] * v[i].a) / v[i].b;
    }
}
int bs()
{
    int st , dr , med , last;
    st = 1;
    dr = 100;
    last = -1;
    while(st <= dr)
    {
        med = (st + dr) / 2;
        if(verif(med))
        {
            last = med;
            reconstituire(med);
            dr = med - 1;
        }
        else
            st = med + 1;
    }
    return last;
}
int main()
{
    freopen("lapte.in" , "r" , stdin);
    freopen("lapte.out" , "w" , stdout);
    int t1 , t2 , i;
    scanf("%d%d" , &n , &l);
    for(i = 1 ; i <= n ; i ++)
    {
        scanf("%d%d" , &t1 , &t2);
        v[i] = lapte(t1 , t2);
    }
    printf("%d\n" , bs());
    for(i = 1 ; i <= n ; i ++)
        printf("%d %d\n" , ans[i].a , ans[i].b);
    return 0;
}