Cod sursa(job #1268357)

Utilizator sebinechitasebi nechita sebinechita Data 20 noiembrie 2014 21:16:24
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define MAX 102
int  p[MAX][MAX];
int c[MAX][MAX], n, l, a[MAX], b[MAX];
pair<int, int> sta[MAX];
void af(int a[MAX][MAX])
{
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
        {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}

bool rez(int t)
{
    int i, j, k;
    memset(c, -1, sizeof(c));
    memset(p, 0, sizeof(p));
    for(i=0;i<=n;i++)
    {
        c[i][0]=0;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<=l;j++)
        {
            for(k=0;k<=t && k+j<=l;k++)
            {
                if(c[i][j]!=-1)
                    if(c[i+1][j+k]<c[i][j]+(t-a[i+1]*k)/b[i+1])
                    {
                        c[i+1][j+k]=c[i][j]+(t-a[i+1]*k)/b[i+1];
                        p[i+1][j+k] = j;
                    }
            }
        }
    }
    if(c[n][l]>=l)
        return 1;
    return 0;

}

int main()
{
    int i, st, dr, k;
    fin>>n>>l;
    for(i=1;i<=n;i++)
    {
        fin>>a[i]>>b[i];
    }
    st=1;
    dr=100;
    while(st<dr)
    {
        int t=(st+dr)>>1;
        k=rez(t);
        if(k)
            dr=t;
        else
            st=t+1;
    }
    rez(st);
    fout << st << "\n";
    int r=l;
    dr=0;
    for(i=n;i>=1;i--)
    {
        sta[++dr]=make_pair(r-p[i][r], c[i][r]-c[i-1][p[i][r]]);
        r=p[i][r];
    }
    for(i=dr;i>=1;i--)
    {
        fout << sta[i].first << " " << sta[i].second << "\n";
    }
}