Cod sursa(job #1736909)

Utilizator Burbon13Burbon13 Burbon13 Data 2 august 2016 21:34:50
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const int nmx = 102;

int n,lapte;
int a[nmx],b[nmx];

void citire()
{
    scanf("%d %d", &n, &lapte);
    for(int i = 1; i <= n; ++i)
        scanf("%d %d", &a[i], &b[i]);
}

int timp_gasit,bg[nmx][nmx],nra[nmx],nrb[nmx];
int bou[nmx][nmx];
int dp[nmx][nmx];
int dpp[nmx][nmx];

int dinamica(int t)
{
    memset(dp,0,sizeof(dp));
    memset(bou,0,sizeof(bou));

    for(int j = 0; j <= lapte; ++j)
        dp[1][j] = t - j;

    for(int i = 2; i <= n; ++i)
        for(int j = 0; j <= lapte; ++j)
            for(int l = 0; l <= lapte; ++l)
            {
                if(j - l >= 0 && l*a[i] <= t && dp[i][j] < dp[i-1][j-l])
                {
                    dp[i][j] = dp[i-1][j-l];
                    bou[i][j] = l;
                }
                if(l*b[i] <= t && dp[i][j] < dp[i-1][j] + l)
                {
                    dp[i][j] = dp[i-1][j]+l;
                    bou[i][j] = 0;
                }
            }

    //for(int i = 1; i <= n; ++i)

    //for(int i = 1; i <= n; ++i)
        if(dp[n][lapte] >= lapte)
            return 1;
    return 0;
}

void copiaza(int t)
{
    timp_gasit = t;
    for(int i = 0; i < nmx; ++i)
        for(int j = 0; j < nmx; ++j)
            {
                bg[i][j] = bou[i][j];
                dpp[i][j] = dp[i][j];
            }
}

void cautare_binara()
{
    int st = 1, dr = lapte, mij;

    while(st <= dr)
    {
        mij = (st + dr) / 2;

        if(dinamica(mij))
        {
            dr = mij - 1;
            copiaza(mij);
        }
        else
            st = mij + 1;
    }
}

void calcul()
{
    int i = n, j = lapte;

    while(i > 1)
    {
        if(bg[i][j]) /// a baut a
        {
            nra[i] += bg[i][j];
            j -= bg[i][j];
            -- i;
        }
        else     /// a baut b
        {
            nrb[i] += dp[i][j] - dp[i-1][j];
            -- i;
        }
    }

    nra[1] = j;
    nrb[1] = dpp[1][j];

}

void afish()
{
    printf("%d\n", timp_gasit);

    for(int i = 1; i <= n; ++i)
        printf("%d %d\n", nra[i], nrb[i]);
}

int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    citire();
    cautare_binara();
    calcul();
    afish();
    return 0;
}