Cod sursa(job #1599318)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 13 februarie 2016 19:23:23
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<stack>

using namespace std;

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

int n, l, t, start;
stack <pair<int, int> > S;
int LBS[105][105], LB[105][105], V[3][105], A[105][105], AS[105][105];

void citire()
{
    f>>n>>l;
    for(int i=1; i<=n; i++)
        f>>V[1][i]>>V[2][i];
}

bool dinam(int timp)
{
    int i, j, k, s = (timp/V[1][1]), l2, v1, v2;

    for(i=0; i<=n; i++)
        for(j=0; j<=100; j++){
            LB[i][j] = -1;
            A[i][j] = -1;
        }

    for(i=0; i <= (timp/v1); i++){
        LB[1][i] = (timp - i*V[1][1])/V[2][1];
        A[1][i] = i;
    }

    for(i=2; i<=n; i++){
        v1 = V[1][i];
        v2 = V[2][i];
        s += (timp/v1);

        for(j = 0; j <= 100 && j <= s; j++){
            for(k = 0; k <= j && k <= (timp/v1); k++){
                l2 = (timp - (k*v1))/v2;
                if(LB[i-1][j-k] + l2 > LB[i][j]){
                    LB[i][j] = LB[i-1][j-k] + l2;
                    A[i][j] = k;
                }
            }
        }
    }

    for(i=100; i >= l; i--)
        if(LB[n][i] >= l){
            for(j=1; j<=n; j++)
                for(k=0; k<=100 && i<=s; k++){
                    AS[j][k] = A[j][k];
                    LBS[j][k] = LB[j][k];
                    start = i;
                }
            return 1;
        }

    return 0;
}

void cautare()
{
    int st, dr, mid, sol;
    st = 1; dr = 100;
    while(st <= dr)
    {
        mid = (st+dr)/2;
        if(dinam(mid)){
            sol = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }
    g<<sol<<"\n";
    while(n){
        S.push(make_pair(AS[n][start], (sol - V[1][n]*AS[n][start])/V[2][n]));
        start = start - A[n--][start];
    }
    while(S.size()){
        g<<S.top().first<<" "<<S.top().second<<"\n";
        S.pop();
    }
}

int main()
{
    citire();
    cautare();
    return 0;
}