Cod sursa(job #2460504)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 23 septembrie 2019 20:18:01
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
#define MAX 131072

using namespace std;
const int NMAX = 103;

FILE *IN;

struct lapte{
    int x, y;
}v[NMAX];

int N, L, ans;
int dp[NMAX][NMAX], poz[NMAX][NMAX];

int pos, sign;
char f[MAX];

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign = 1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

inline void read(){
    Read(N); Read(L);
    for(int i = 1; i <= N; i++){
        Read(v[i].x); Read(v[i].y);
    }
}

bool dinamica(int t){
    for(int i = 0; i <= N; i++)
        for(int j = 0; j <= L; j++)
            dp[i][j] = -2e9;
    dp[0][0] = 0;
    for(int i = 1; i <= N; i++)
        for(int j = 0; j <= t / v[i].x && j * v[i].x <= t; j++){
            int x = (t - j * v[i].x) / v[i].y;
            for(int k = 0; k + j <= L; k++)
                if(dp[i][k + j] < dp[i - 1][k] + x){
                    dp[i][k + j] = dp[i - 1][k] + x;
                    poz[i][k + j] = j;
                }
        }
    return dp[N][L] >= L;
}

void afisare(int i, int j){
    int x = poz[i][j];
    int y = (ans - x * v[i].x) / v[i].y;
    if(i != 1)
        afisare(i - 1, j - x);
    printf("%d %d\n", x, y);
}

int main(){

    IN = fopen("lapte.in", "r");
    freopen("lapte.out", "w", stdout);

    read();
    int st = 1, nd = 100, mid;
    while(st <= nd){
        mid = (st + nd) / 2;
        if(dinamica(mid)){
            ans = mid;
            nd = mid - 1;
        } else st = mid + 1;
    }
    dinamica(ans);

    printf("%d\n", ans);
    afisare(N, L);

    return 0;
}