Cod sursa(job #2890958)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 17 aprilie 2022 10:38:53
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
//Ilie Dumitru
#include<cstdio>
#include<vector>
typedef long long int ll;
const int NMAX=105;
const ll MOD=1000000007;

FILE* f=fopen("lapte.in", "r"), *g=fopen("lapte.out", "w");

int N, L, A[NMAX], B[NMAX], min[NMAX];
int prev[NMAX][NMAX], cntA[NMAX][NMAX];

bool solve(int T)
{
    int i, j, k, b;
    for(i=1;i<=L;++i)
        min[i]=-1;
    min[0]=0;
    for(j=0;j<N;++j)
        for(i=L-1;i>-1;--i)
        {
            if(min[i]!=-1)
            {
                for(k=1;k*A[j]<=T && k+i<=L;++k)
                {
                    b=(T-k*A[j])/B[j];
                    if(b+min[i]>min[i+k])
                        min[i+k]=b+min[i];
                }
                b=T/B[j];
                min[i]+=b;
            }
        }
    return min[L]>=L;
}

void solve_1(int T)
{
    int i, j, k, b;
    for(i=1;i<=L;++i)
        min[i]=-1;
    min[0]=0;
    for(j=0;j<N;++j)
        for(i=L-1;i>-1;--i)
        {
            if(min[i]!=-1)
            {
                for(k=1;k*A[j]<=T && k+i<=L;++k)
                {
                    b=(T-k*A[j])/B[j];
                    if(b+min[i]>min[i+k])
                    {
                        min[i+k]=b+min[i];
                        prev[i+k][min[i+k]]=j;
                        cntA[i+k][min[i+k]]=k;
                    }
                }
                b=T/B[j];
                min[i]+=b;
                prev[i][min[i]]=j;
                cntA[i][min[i]]=0;
            }
        }
}

int ans[NMAX][2];

int main()
{
    int i, l=0/*T=l secunde e insuficient*/, r=101/*T=r secunde e suficient*/, m;
    fscanf(f, "%d%d", &N, &L);
    for(i=0;i<N;++i)
        fscanf(f, "%d%d", A+i, B+i);
    while(r-l>1)
    {
        m=(l+r)>>1;
        if(solve(m))
            r=m;
        else
            l=m;
    }
    fprintf(g, "%d\n", r);
    solve_1(r);

    int a=L, b=min[L], ma, mb;
    while(a || b)
    {
        ma=cntA[a][b];
        mb=(r-ma*A[prev[a][b]])/B[prev[a][b]];
        ans[prev[a][b]][0]=ma;
        ans[prev[a][b]][1]=mb;
        a-=ma;
        b-=mb;
    }

    for(i=0;i<N;++i)
        fprintf(g, "%d %d\n", ans[i][0], ans[i][1]);
    fclose(f);
    fclose(g);
    return 0;
}