Cod sursa(job #2454477)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 8 septembrie 2019 17:00:17
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

FILE *in = fopen("lapte.in", "r"), *out = fopen("lapte.out", "w")  ;

const int MV = 110 ;
const int INF = 1e9 ;

int dp[MV][MV], tata[MV][MV], ca[MV], cb[MV] ;
int sol[2][MV]  ;
int n, l, q ;

bool verif(int time) {
        int i, j, la, lb ;
        for (i = 0 ; i <= n ; ++ i) {
                for (j = 0 ; j <= l ; ++ j) {
                        dp[i][j] = -2 * INF ;
                }
        }
        dp[0][0] = 0 ;
        for (i = 1 ; i <= n ; ++ i)
                for (la = 0 ; la <= time/ ca[i] ; ++ la)
                        for (j = 0 ; j <= l - la ; ++ j) {
                                lb = (time- ca[i] * la) / cb[i] ;
                                if (dp[i - 1][j] + lb > dp[i][j + la]) {
                                        dp[i][j + la] = dp[i - 1][j] + lb ;
                                        tata[i][j + la] = la ;
                                }
                        }
        return dp[n][l] >= l ;
}

int main() {
        int i, j ;
        fscanf(in, "%d %d", &n, &l)  ;
        for (i = 1 ; i <= n ; i++)
                fscanf(in, "%d %d", ca + i, cb + i)  ;
        int ans(0) ;
        for (int step(1 << 7) ; step ; step >>= 1) {
                if (!verif(ans + step)) {
                        ans |= step ;
                }
        }
        fprintf(out, "%d\n", ans + 1)  ;
        verif(ans + 1) ;
        i = n ;
        j = l ;
        while (i >= 0 && j >= 0) {
                q = tata[i][j] ;
                sol[0][i] = q ;
                sol[1][i] = dp[i][j] - dp[i - 1][j - q] ;
                i-- ;
                j -= q ;
        }
        for (i = 1 ; i <= n ; i++)
                fprintf(out, "%d %d\n", sol[0][i], sol[1][i]) ;
}