Cod sursa(job #2215607)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 22 iunie 2018 19:40:50
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
#define N 102
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l, spd[N][2], sol[N][2], timeB[N][N], dp[N][N];
int verif(int tmp)
{
    int i, j, k;
    for(i=0; i<=n; i++)
        for(j=0; j<=l; j++)
            dp[i][j]=INT_MIN;
    for(i=1; i<=n; i++)
        for(j=0; j<=l && tmp-j*spd[i][0]>=0; j++)
            timeB[i][j]=(tmp-j*spd[i][0])/spd[i][1];
    dp[0][0]=0;
    for(i=1; i<=n; i++)
        for(j=0; j<=l; j++)
            for(k=0; k<=j && tmp-k*spd[i][0]>=0; k++)
                dp[i][j]=max(dp[i][j],dp[i-1][j-k]+timeB[i][k]);
    return (dp[n][l]>=l);
}
int bs()
{
    int st=0, dr=101, mid, sol;
    while(st<=dr){
        mid=st+(dr-st)/2;
        if(verif(mid)){
            sol=mid;
            dr=mid-1;
        }
        else st=mid+1;
    }
    return sol;
}
int main()
{
    int i, j, sl, tmp;
    fin>>n>>l;
    for(i=1; i<=n; i++)
        fin>>spd[i][0]>>spd[i][1];
    sl=bs();
    fout<<sl<<'\n';
    verif(sl);
    tmp=sl;
    sl=l;
    for(i=n; i>=1; i--)
        {
            for(j=0; j<=sl && tmp-j*spd[i][0]>=0; j++)
                if(dp[i][sl]==dp[i-1][sl-j]+timeB[i][j]){
                    sol[i][0]=j;
                    sol[i][1]=timeB[i][j];
                    sl-=j;
                    break;
            }
        }
    for(i=1; i<=n; i++)
        fout<<sol[i][0]<<' '<<sol[i][1]<<'\n';
    return 0;
}