Cod sursa(job #1056472)

Utilizator TheShadowsAlexandru Cristian TheShadows Data 14 decembrie 2013 13:08:38
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int LIM = 101;
struct copil{
    int a,b;
}cp[LIM];
int n,l;
int dr[110][210]; copil urma[110][210];
bool canDrink(int t){
    for(int i=0; i<=n; i++){
        dr[i][0]=0;
        for(int j=1; j<=200; j++)
            dr[i][j]=-1;
    }
    for(int i=1; i<=n; i++){
        for(int j=l; j>=0; j--){
            if(dr[i-1][j]!=-1){
                for(int b=0; b*cp[i].b<=t; b++){
                    int ramas = t - b*cp[i].b;
                    int a = ramas / cp[i].a;
                    if(dr[i][j+b]<a+dr[i-1][j]){
                        urma[i][j+b].a = a;
                        urma[i][j+b].b = b;
                        dr[i][j+b] = a+dr[i-1][j];
                    }
                }
            }
        }
    }

    for(int i=l; i<=200; i++){
        if(dr[n][i]!=-1){
            if(dr[n][i]>=l)
                return true;
            else return false;
        }
    }
    return false;
}
int main(){
    FILE *in=fopen("lapte.in","r"), *out=fopen("lapte.out","w");
    fscanf(in, "%d%d", &n, &l);
    for(int i=1; i<=n; i++){
        fscanf(in, "%d%d", &cp[i].a, &cp[i].b);
    }

    int l1=1, l2=100, l3, sol=100;
    while(l1<l2){
        l3=l1+(l2-l1)/2;
        if(canDrink(l3)){
            sol=l3;
            l2=l3-1;
        }else{
            l1=l3+1;
        }
    }

    canDrink(sol);
    fprintf(out, "%d\n", sol);

    int baut = -1;
    for(int i=l; i<=200 && baut==-1; i++){
        if(dr[n][i]!=-1 && dr[n][i]>=l){
            baut = i;
        }
    }


    int curent = n;
    while(curent > 0){
        cp[curent].a = urma[curent][baut].a;
        cp[curent].b = urma[curent][baut].b;
        baut -= urma[curent][baut].b;
        curent--;
    }


    for(int i=1; i<=n; i++){
        fprintf(out, "%d %d\n", cp[i].a, cp[i].b);
    }

    for(int i=1; i<=n; i++){
        for(int j=0; j<=l; j++)
            fprintf(out, "%d ", dr[i][j]);
        fprintf(out, "\n");
    }
    return 0;
}