Cod sursa(job #1056562)

Utilizator assa98Andrei Stanciu assa98 Data 14 decembrie 2013 13:14:16
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 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;
    }
};

struct rec {
    int i,j,k;
    rec() {
        i=j=k;
    }
    rec(int _i,int _j, int _k) {
        i=_i;
        j=_j;
        k=_k;
    }
};

const int MAX_N=110;

bool d[MAX_N][MAX_N][MAX_N];
rec dad[MAX_N][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) {
            for(int k=0;k<=L;++k) {
                d[i][j][k]=false;
            }
        }
    }
    d[0][0][0]=true;
}

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

void solve(int t) {
    init();
    for(int i=1;i<=N;++i) {
        for(int j=0;j<=L;++j) {
            for(int k=0;k<=L;++k) {
                if(d[i-1][j][k]) {
                    for(int p=0;p<=t/v[i].a;p++) {
                        d[i] [min(j+p,L)] [ min(k + (t - p*v[i].a) / v[i].b, L)]=true;
                        dad[i] [min(j+p,L)] [ min(k + (t - p*v[i].a) / v[i].b, L)]=rec(i-1,j,k);
                    }
                }
            }
        }
    }
}

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);
    solve(a);
    
    rec act=rec(N,L,L);
    while(act.i!=0) {
        rec aux=act;
        act=dad[aux.i][aux.j][aux.k];
        beut[aux.i]=be(aux.j-act.j,aux.k-act.k);
    }
    
    for(int i=1;i<=N;++i) {
        printf("%d %d\n",beut[i].a,beut[i].b);
    }

    return 0;
}