Cod sursa(job #3190952)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 8 ianuarie 2024 14:22:08
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#define INF 0x3FFFFFFF
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

int d[105][105];
int n,l;

struct om
{
    int a;
    int b;
} v[105];

int s[105][105];


bool good(int val)
{
    for(int i=0; i<=n; i++)
        for(int j = 0; j<=l; j++)
            d[i][j] = -INF;
    d[0][0]=0;
    for(int i=1; i<=n; i++)
        for(int astart = 0; astart<=l; astart++)
            for(int x = 0; astart + x <=l; x++)
            {
                if(v[i].a * x > val)
                    break;
                int badd = min((val - v[i].a * x)/v[i].b,l-d[i-1][astart]);
                if(d[i-1][astart] + badd > d[i][astart + x])
                    d[i][astart + x] = d[i-1][astart] + badd;

            }
    return d[n][l]>=l;
}

bool gen(int val)
{
    for(int i=0; i<=n; i++)
        for(int j = 0; j<=l; j++)
            d[i][j] = -INF;
    d[0][0]=0;
    for(int i=1; i<=n; i++)
        for(int astart = 0; astart<=l; astart++)
            for(int x = 0; astart + x <=l; x++)
            {
                if(v[i].a * x > val)
                    break;
                int badd = min((val - v[i].a * x)/v[i].b,l-d[i-1][astart]);
                if(d[i-1][astart] + badd > d[i][astart + x]){
                    d[i][astart + x] = d[i-1][astart] + badd;
                    s[i][astart +x] = astart;
                }

            }
    return d[n][l]>=l;
}


int cb()
{
    int st = 1;
    int dr = 100;
    int sl = 0;
    while(st<=dr)
    {
        int mid = (st+dr)/2;
        if(good(mid))
            sl=mid,dr=mid-1;
        else
            st=mid+1;
    }
    return sl;
}

void rec(int i,int j)
{
    if(i!=0 || j!=0)
    {
        rec(i-1,s[i][j]);
        fout<<j-s[i][j]<<' '<<d[i][j]-d[i-1][s[i][j]]<<'\n';
    }
}

int main()
{
    fin>>n>>l;
    for(int i=1; i<=n; i++)
        fin>>v[i].a>>v[i].b;
    int rez = cb();
    fout<<rez<<'\n';
    gen(rez);
    rec(n,l);

}