Cod sursa(job #2223072)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 19 iulie 2018 01:20:15
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l;
struct milk
{
    int a,b;
};
milk v[102];
bool dp[102][102];
int aa[102][102],bb[102][102];
int du[102][102];
bool check(int maxx)
{
    memset(dp,0,sizeof(dp));
    memset(du,0,sizeof(du));
    memset(aa,0,sizeof(aa));
    memset(bb,0,sizeof(bb));
    dp[l][l]=1;
    for(int i=1;i<=n;++i)
    {
        vector<pair<int,int> >a;
        int xx=maxx/v[i].a;
        int yy=(maxx-(xx*v[i].a))/v[i].b;
        while(xx)
        {
            a.push_back({xx,yy});
            int pp;
            do{
                --xx;
                pp=xx*v[i].a+yy*v[i].b;
            }while(xx && maxx-pp<v[i].b);
            while(xx*v[i].a+(yy+1)*v[i].b<=maxx)
                ++yy;
        }
        a.push_back({xx,yy});
        for(int j=0;j<=l;++j)
            for(int k=0;k<=l;++k)
            {
                if(!dp[j][k])
                    continue;
                for(int p=0;p<a.size();++p)
                {
                    if(dp[max(0,j-a[p].first)][max(0,k-a[p].second)])
                        continue;
                    dp[max(0,j-a[p].first)][max(0,k-a[p].second)]=1;
                    du[max(0,j-a[p].first)][max(0,k-a[p].second)]=i;
                    aa[max(0,j-a[p].first)][max(0,k-a[p].second)]=a[p].first;
                    bb[max(0,j-a[p].first)][max(0,k-a[p].second)]=a[p].second;
                }
                if(dp[0][0])
                    return 1;
            }
    }
    return 0;
}
struct ss
{
    int a,b;
};
ss aaaa[102];
int main()
{
    f>>n>>l;
    for(int i=1;i<=n;++i)
        f>>v[i].a>>v[i].b;
    int b=1;
    int e=101;
    int sol=0;
    while(b<=e)
    {
        int mid=(b+e)/2;
        if(check(mid))
            sol=mid,e=mid-1;
        else
            b=mid+1;
    }
    check(sol);
    int p=0;
    int q=0;
    while(!(p==l && q==l))
    {
        aaaa[du[p][q]]={aa[p][q],bb[p][q]};
        int x=aa[p][q];
        int y=bb[p][q];
        p+=x;
        q+=y;
    }
    g<<sol<<'\n';
    for(int i=1;i<=n;++i)
        g<<aaaa[i].a<<" "<<aaaa[i].b<<'\n';
    return 0;
}