Cod sursa(job #1143102)

Utilizator costyrazvyTudor Costin Razvan costyrazvy Data 14 martie 2014 19:04:36
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#define NMAX 200
#include <cstring>
using namespace std;
int D[NMAX][NMAX];
int P[NMAX][NMAX];
int A[NMAX],B[NMAX];
struct key{int a;int b;};
key L[NMAX];
int N,st,dr,mij,sol,l,i;
bool DINAMICA(int x)
{
    int i,j,k;
    memset(P,0,sizeof(P));
    memset(D,0,sizeof(D));
    for (i=0; i<=N; i++){
        for (j=1; j<=l; j++)
            D[i][j]=-1000000;
        D[i][0]=0;
    }
    for (i=1; i<=N; i++){
        for (j=0; j<=l; j++){
            for (k=0; k<=min(x/L[i].a,j); k++)
                if (D[i-1][j-k]!=-1 && D[i][j]<D[i-1][j-k]+(x-k*L[i].a)/L[i].b){
                    D[i][j]=D[i-1][j-k]+(x-k*L[i].a)/L[i].b;
                    P[i][j]=k;
                }
        }
    }
    if (D[N][l] >= l) return true;
        return false;
}
int main()
{
    ifstream f("lapte.in");
    ofstream g("lapte.out");
    f>>N>>l;
    for (i=1;i<=N;i++) f>>L[i].a>>L[i].b;
    st=0;dr=120;
    while (st<=dr) {
        mij=(st+dr)/2;
        if (DINAMICA(mij)){
            sol=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    for (i=N;i>=1;i--){
        A[i]=P[i][l];
        l-=A[i];
        B[i]=(sol-A[i]*L[i].a)/L[i].b;
    }
    g<<sol<<'\n';
    for (i=1; i<=N; i++)
        g<<A[i]<<" "<<B[i]<<'\n';
    f.close();
    g.close();
    return 0;
}