Cod sursa(job #2642518)

Utilizator stefantagaTaga Stefan stefantaga Data 15 august 2020 19:14:21
Problema Lapte Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,cant,i,st,dr,mij,restb,t,k,sol;
struct wow
{
    int x,y;
}v[105];
struct mama
{
    int x,y,ind;
};
pair <int,int> solutii[105];
bool ok (int timp)
{
    int din[105][105],j,lima,din1[105][105],copie;
    pair <int,int> valori[105];
    for (i=1;i<=n;i++)
    {
        valori[i]={0,0};
    }
    mama tata[105][105];
    for (i=0;i<=cant;i++)
    {
        for (j=0;j<=cant;j++)
        {
            din[i][j]=din1[i][j]=-1;
            tata[i][j].x=tata[i][j].y=tata[i][j].ind=0;
        }
    }
    din[0][0]=0;
    din1[0][0]=0;
    for (i=1;i<=n;i++)
    {
        lima=timp/v[i].x;
        for (j=0;j<=lima;j++)
        {
            restb=(timp-j*v[i].x)/v[i].y;
            for (t=cant;t>=0;t--)
            {
                for (k=cant;k>=0;k--)
                {
                    if (din[t][k]!=-1)
                    {
                        din1[min(t+j,cant)][min(k+restb,cant)]=0;
                        if (tata[min(t+j,cant)][min(k+restb,cant)].ind==0)
                        {
                            tata[min(t+j,cant)][min(k+restb,cant)].x=t;
                        tata[min(t+j,cant)][min(k+restb,cant)].y=k;
                        tata[min(t+j,cant)][min(k+restb,cant)].ind=i;
                        }
                    }
                }
            }
        }
        for (t=0;t<=cant;t++)
        {
            for (k=0;k<=cant;k++)
            {
                din[t][k]=din1[t][k];
            }
        }
    }
    if (din[cant][cant]==0)
    {
        i=cant;
        j=cant;
        while (i!=0&&j!=0)
        {
            valori[tata[i][j].ind]={i-tata[i][j].x,j-tata[i][j].y};
            copie=i;
            i=tata[i][j].x;
            j=tata[copie][j].y;
        }
        valori[tata[i][j].ind]={i-tata[i][j].x,j-tata[i][j].y};
        for (i=1;i<=n;i++)
        {
            solutii[i]=valori[i];
        }
        return 1;
    }
    return 0;
}
int main()
{
    f>>n>>cant;
    for (i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
    }
    st=1;
    dr=1000;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (ok(mij)==1)
        {
            sol=mij;
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
    g<<sol<<'\n';
    for (i=1;i<=n;i++)
    {
        g<<solutii[i].first<<" "<<solutii[i].second<<'\n';
    }
    return 0;
}