Cod sursa(job #1452630)

Utilizator sebinechitasebi nechita sebinechita Data 21 iunie 2015 15:11:48
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define MAX 103
#define cout fout
vector <pair <int, int> > sol;

pair <int, int> x[MAX];
int a[MAX][MAX], dad[MAX][MAX];
int n, l;

bool rez(int time)
{
    int i, j, k;
    a[0][0] = 0;
    for(j = 1 ; j <= l ; j++)
        a[0][j] = -(1<<29);
    for(i = 1 ; i <= n ; i++)
    {
        for(j = 0 ; j <= l ; j++)
        {
            a[i][j] = a[i - 1][j];
            dad[i][j] = 0;
            for(k = 0 ; k <= j && k * x[i].first <= time ; k++)
            {
                if(a[i][j] < a[i - 1][j - k] + (time - k * x[i].first) / x[i].second)
                {
                    a[i][j] = a[i - 1][j - k] + (time - k * x[i].first) / x[i].second;
                    dad[i][j] = k;
                }
            }
        }
    }
    return a[n][l] >= l;
}

void af()
{
    for(int i = 1 ; i <= n ; i ++)
    {
        for(int j = 1 ; j <= l ; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }
}

int main()
{

    int i, st, dr, ok;
    fin >> n >> l;
    for (i = 1 ; i <= n ; i ++)
    {
        fin >> x[i].first >> x[i].second;
    }
    st = 0;
    dr = 100;
    while(st <= dr)
    {
        int mij = st + (dr - st) / 2;
        if(rez(mij))
        {
            ok = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    cout << ok << "\n";
    rez(ok);
    int j;
    j = l;
    for(i = n ; i >= 1 ; i--)
    {
        sol.push_back(make_pair(dad[i][j], (ok - dad[i][j] * x[i].first) / x[i].second));
        j -= dad[i][j];
    }
    for(vector <pair<int, int> > :: reverse_iterator it = sol.rbegin(); it != sol.rend() ; it++)
    {
        cout << it->first << " " << it->second << "\n";
    }
}