Cod sursa(job #3190881)

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

int n,l;

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


///   a    b
int d[155][155];

pair<int,int> t[105][105];

void gen(int val)
{
    for(int i = 0;i<=l;i++)
        for(int j=0;j<=l;j++)
            d[i][j]=0,t[i][j]={0,0};
    d[0][0]=1;
    for(int i = 1;i<=n;i++)
        for(int a = l;a>=0;a--)
            for(int b = l;b>=0;b--)
                if(d[a][b])
    {

        for(int x = 1; a+x<=l && x*v[i].a<=val; x++)
        {
            int ramas = min((val - x * v[i].a) / v[i].b,l-b);
            d[a + x][b + ramas] = 1;
            t[a+x][b+ramas]={a,b};
        }
    }
}


bool ok(int val)
{
    for(int i = 0;i<=l;i++)
        for(int j=0;j<=l;j++)
            d[i][j]=0,t[i][j]={0,0};
    d[0][0]=1;
    for(int i = 1;i<=n;i++)
        for(int a = l;a>=0;a--)
            for(int b = l;b>=0;b--)
                if(d[a][b])
    {

        for(int x = 1; a+x<=l && x*v[i].a<=val; x++)
        {
            int ramas = min((val - x * v[i].a) / v[i].b,l-b);
            d[a + x][b + ramas] = 1;
            //t[a+x][b+ramas]={a,b};
            if(a+x==l && b+ramas==l)
                return d[l][l];
        }

    }
    return d[l][l];
}

int b_s()
{
    int st = 1;
    int dr = INF;
    int p = -1;
    while(st<=dr)
    {
        int mid = (st+dr)/2;
        if(ok(mid))
            dr=mid-1,p=mid;
        else
            st=mid+1;
    }
}
void rec(int x,int y)
{
    if(x!=0 || y!=0)
    {
        int tx = t[x][y].first;
        int ty = t[x][y].second;
        rec(tx,ty);
        fout<<x-tx<<' '<<y-ty<<'\n';
    }
}


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