Cod sursa(job #2397669)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 4 aprilie 2019 17:55:21
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
#define va first.first
#define vb first.second
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int dp[102][102],aa[102][102],l,n,timp;
pair<pair<int,int>,int> a[102];
pair<int,int> lmao[102];
bool ok(int t)
{
    int i,j,k,s=0;
    for(i=1;i<=n;i++)
    {
        for(j=0;j<=l;j++)
        {
            dp[i][j]=-1;
            for(k=min(j,t/a[i].va);k>=0&&j-k<=s;k--)
                if(dp[i][j]<dp[i-1][j-k]+(t-a[i].va*k)/a[i].vb)
                {
                    dp[i][j]=dp[i-1][j-k]+(t-a[i].va*k)/a[i].vb;
                    aa[i][j]=k;
                }
        }
        s+=t/a[i].va;
    }
    return dp[n][l]>=l;
}
void bk(int x,int y)
{
    if(x>1)
        bk(x-1,y-aa[x][y]);
    lmao[a[x].second]={aa[x][y],(timp-aa[x][y]*a[x].va)/a[x].vb};
}
int main()
{
    int i,r=0,pas=1<<15;
    in>>n>>l;
    for(i=1;i<=n;i++)
    {
        in>>a[i].va>>a[i].vb;
        a[i].second=i;
    }
    sort(a,a+n);
    for(;pas;pas>>=1)
        if(!ok(r+pas))
            r+=pas;
    timp=r+1;
    out<<timp<<"\n";
    ok(timp);
    bk(n,l);
    for(i=1;i<=n;i++)
        out<<lmao[i].first<<" "<<lmao[i].second<<"\n";
    return 0;
}