Cod sursa(job #1065592)

Utilizator assa98Andrei Stanciu assa98 Data 23 decembrie 2013 14:55:05
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

struct be {
    int a,b;
    be() {
        a=b=0;
    }
    be(int _a,int _b) {
        a=_a;
        b=_b;
    }
};


const int MAX_N=110;

int d[MAX_N][MAX_N];
int dad[MAX_N][MAX_N];

int N,L;
be v[MAX_N];

void init() {
    for(int i=0;i<=N;++i) {
        for(int j=0;j<=L;++j) {
            d[i][j]=-1;
            dad[i][j]=0;
        }
    }
    d[0][0]=0;
}

bool dinamic(int t) {
    init();
    for(int i=1;i<=N;++i) {
        for(int j=0;j<=L;++j) {
            if(d[i-1][j]!=-1) {
                for(int p=0;p<=t/v[i].a && j+p<=L;p++) {
                    if( d[i-1][j]+ (t - p*v[i].a) / v[i].b > d[i][j+p] ) {
                        d[i][j+p] = d[i-1][j]+ (t - p*v[i].a) / v[i].b ;
                        dad[i][j+p]=p;
                    }
                }
            }
        }
    }
    return d[N][L]>=L;
}


int b_search(int st,int dr) {
    int ans=100;
    while(st<=dr) {
        int mij=(st+dr)/2;
        if(dinamic(mij)) {
            ans=mij;
            dr=mij-1;
        }
        else {
            st=mij+1;
        }
    }
    return ans;
}

be beut[MAX_N];

int main() {
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    
    scanf("%d%d",&N,&L);
    for(int i=1;i<=N;++i) {
        int a,b;
        scanf("%d%d",&a,&b);
        v[i]=be(a,b);
    }
    
    int a=b_search(1,100);
    printf("%d\n",a);
    
    dinamic(a);
    for(int i=N,l=L;i>=1;i--) {
        beut[i].a=dad[i][l];
        beut[i].b=(a-beut[i].a*v[i].a)/v[i].b;
        l-=dad[i][l];
    }
    
    for(int i=1;i<=N;++i) {
        printf("%d %d\n",beut[i].a,beut[i].b);
    }

    return 0;
}