Cod sursa(job #1276223)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 26 noiembrie 2014 02:20:40
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream is("lapte.in");
ofstream os("lapte.out");

int N, L, x, y, Sol;
int D[101][101];
int T[101][101];
vector <pair<int,int> > V;

void Input();
void BinarySearch();
bool Check(int x);
void Output(int x, int y);

int main()
{
    Input();
    BinarySearch();
    is.close();
    os.close();
}

void Input()
{
    is >> N >> L;
    for ( int i = 1; i <= N; ++i )
    {
        is >> x >> y;
        V.push_back(make_pair(x,y));
    }
}

bool Check(int x)
{
    for ( int i = 0; i <= N; ++i )
        for ( int j = 0; j <= L; ++j )
            D[i][j] = -10000;

    D[0][0] = 0;

    for ( int i = 1; i <= N; ++i)
    {
        for ( int j = 0; j <= L; ++j )
            for ( int k = 0; k <= j &&  k * V[i-1].first <= x; ++k )
            {
                if ( D[i][j] <= D[i-1][j-k] + (x-k * V[i-1].first)/V[i-1].second)
                {
                    D[i][j] = D[i-1][j-k] + (x-k * V[i-1].first)/V[i-1].second;
                    T[i][j] = k;
                }
            }
    }

    return D[N][L] >= L;
}

void BinarySearch()
{
    int hi(100), lo(1), mid;

    while ( lo < hi)
    {
        mid = (lo + hi)/2;
        if ( Check(mid) )
           hi = mid;
        else
           lo = mid+1;
    }
    Sol = hi;
    os << Sol << '\n';
    Check(hi);
    Output(L,N);
}

void Output(int x, int y)
{
    if ( y == 0 ) return;
    Output(x - T[y][x], y - 1);

    os << T[y][x] << " " << (Sol - T[y][x] *V[y-1].first)/V[y-1].second  << '\n';
}