Cod sursa(job #2090893)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 18 decembrie 2017 20:20:43
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
#define MAXN 100
#define MAXL 100
int n, l;
int a[1 + MAXN], b[1 + MAXN];
int d[1 + MAXN][1 + MAXL];
int p[1 + MAXN][1 + MAXL];
FILE*fi,*fo;
inline int f(int val){
    for(int i = 0; i <= n; i++)
        for(int f = 0; f <= l; f++)
            d[i][f] = -1;
    d[0][0] = 0;
    for(int i = 1; i <= n; i++)
        for(int f = 0; f <= l; f++)
            for(int j = 0; j <= f && j * a[i] <= val; j++)
                if(d[i - 1][f - j] >= 0){
                    d[i][f] = std::max(d[i][f], d[i - 1][f - j] + (val - j * a[i]) / b[i]);
                    p[i][f] = f - j;
                }
    if(d[n][l] >= l) return 1;
    return 0;
}
void print(int val, int ind, int i){
    if(ind > 0){
        print(val, ind - 1, p[ind][i]);
        fprintf(fo,"%d %d\n", i - p[ind][i], (val - (i - p[ind][i]) * a[ind]) / b[ind]);
    }
}

int main(){
    fi=fopen("lapte.in","r");
    fo=fopen("lapte.out","w");

    fscanf(fi,"%d%d", &n, &l);
    for(int i = 1; i <= n; i++)
        fscanf(fi,"%d%d", &a[i], &b[i]);
    int st = 1, dr = 100;
    while(dr - st > 1){
        int m = (st + dr) / 2;
        if(f(m)) dr = m;
        else st = m + 1;
    }
    if(f(st)){
        fprintf(fo,"%d\n", st);
        print(st, n, l);
    }
    else{
        fprintf(fo,"%d\n", dr);
        print(dr, n, l);
    }

    fclose(fi);
    fclose(fo);
    return 0;
}