Cod sursa(job #1283276)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 5 decembrie 2014 14:40:59
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <string.h>
#define NMax 101
#define INF -2000000000
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, l, i, j, k, st, dr, mid, d[NMax][NMax], reca[NMax][NMax], rec[NMax][NMax], sol;
struct lapte
{
    int a;
    int b;
}la[NMax], reconst[NMax];
int din(int t)
{
    for (i=1; i<=n; i++)
        for(j=0; j<=l; j++) {
            d[i][j]=INF;
            rec[i][j]=0;
        }

    for (i=0; i<=t/la[1].a; i++)
        if (t-i*la[1].a >= 0)
            d[1][i]=(t-i*la[1].a)/la[1].b;
    for (k=2; k<=n; k++) {
        for (i=0; i<=l && d[k-1][i]!=INF; i++)
           {
            for (j=0; j<=t/la[k].a; j++) {
                if (t-j*la[k].a >=0) {
                    /*if (i+j > l) {
                        if (d[k][l] < d[k-1][i]+(t-j*la[k].a)/la[k].b) {
                            d[k][l]=d[k-1][i]+(t-j*la[k].a)/la[k].b;
                            rec[k][l]=i;
                        }
                    }
                    else*/
                    if(i+j<=l) {
                        if (d[k][i+j] < d[k-1][i]+(t-j*la[k].a)/la[k].b) {
                            d[k][i+j]=d[k-1][i]+(t-j*la[k].a)/la[k].b;
                            rec[k][i+j]=i;
                        }
                    }
                }
            }
        }
    }
   return d[n][l]>=l;
}
int main()
{
    f>>n>>l;
    for (i=1; i<=n; i++)
        f>>la[i].a>>la[i].b;
    st=1;
    dr=100;
    while (st<=dr) {
        mid=(st+dr)/2;
        int t=din(mid);
        if (t) {
            memcpy(reca, rec, sizeof (rec));
            sol=mid;
            dr=mid-1;
        }
        else
            st=mid+1;
    }
    g<<sol<<"\n";
    int ta=n;
    while (ta>0) {
        reconst[ta].a= l-reca[ta][l];
        reconst[ta].b=(sol-reconst[ta].a*la[ta].a)/la[ta].b;
        l=reca[ta][l];
        ta--;
    }
    for (i=1; i<=n; i++)
        g<<reconst[i].a<<" "<<reconst[i].b<<"\n";
    return 0;
}