Cod sursa(job #2112493)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 23 ianuarie 2018 15:48:42
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>
#define INF 2000000000

using namespace std;
pair <int,int> rec[101][101],sol[101];
int d[101][101],n,l,a[101],b[101];
int verif (int t){
    int i,j,jj,lb;
    // d[i][j] = nr de l de lapte B bauti daca nr 1..i-1 beau j l de lapte A
    for (i=0;i<=100;i++)
        for (j=0;j<=100;j++)
            d[i][j]=-INF;
    d[0][0]=0;
    for (i=1;i<=n;i++){
        for (j=0;j<=t/a[i];j++){ // i bea fix j litri de lapte A
            for (jj=0;jj+j<=l;jj++){
                lb=(t-j*a[i])/b[i];
                if (lb+d[i-1][jj]>d[i][j+jj]){
                    d[i][j+jj]=lb+d[i-1][jj];
                    rec[i][j+jj]=make_pair(j,lb);
                }
            }
        }
    }
    if (d[n][l]>=l)
        return 1;
    return 0;
}
int main()
{
    FILE *fin=fopen ("lapte.in","r");
    FILE *fout=fopen ("lapte.out","w");
    int i,st,dr,mid,j;
    fscanf (fin,"%d%d",&n,&l);
    for (i=1;i<=n;i++)
        fscanf (fin,"%d%d",&a[i],&b[i]);
    st=1;
    dr=100;
    while (st<=dr){
        mid=(st+dr)/2;
        if (verif (mid))
            dr=mid-1;
        else st=mid+1;
    }
    fprintf (fout,"%d\n",st);
    verif (st);
    j=l;
    for (i=n;i>0;i--){
        sol[i]=rec[i][j];
        j=j-rec[i][j].first;
    }
    for (i=1;i<=n;i++)
        fprintf (fout,"%d %d\n",sol[i].first,sol[i].second);
    return 0;
}