Cod sursa(job #1844022)

Utilizator AronZekAron Jinga AronZek Data 9 ianuarie 2017 17:32:00
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>

#define se second
#define fi first

using namespace std;

ifstream f ("lapte.in");
ofstream g ("lapte.out");

int dp[150][255] , pos[105][255];
int n , l , ans;

pair <int , int> v[205];

bool verif (int tmax) {
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= 2 * l; ++j) {
            dp[i][j] = -1;
        }
    }

    dp[0][0] = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j <= 2 * l; ++j) {
            for (int k = 0; k <= tmax / v[i].fi; ++k) {
                if (k > j)
                    break;

                if (dp[i - 1][j - k] == -1)
                    continue;

                /*if ((tmax - k * v[i].fi) % v[i].se != 0)
                    continue;*/

                if (dp[i - 1][j - k] + (tmax - k * v[i].fi) / v[i].se > dp[i][j]) {
                    dp[i][j] = max (dp[i][j] , dp[i - 1][j - k] + (tmax - k * v[i].fi) / v[i].se);
                    pos[i][j] = k;
                }
            }
        }
    }

    for (int i = l; i <= 2 * l; ++i) {
        if (dp[n][i] >= l)
            return 1;
    }

    return 0;
}

void afis (int i, int j) {
    if (i == 0)
        return;

    afis (i - 1, j - pos[i][j]);
    g << pos[i][j] << " " << (ans - pos[i][j] * v[i].fi) / v[i].se << '\n';
}

void write () {
    int p1 = 0, p2 = 0;
    bool ok = verif (ans);

    for (int i = l; i <= 2 * l; ++i) {
        if (dp[n][i] >= l) {
            p1 = n, p2 = i;
            break;
        }
    }

    afis (p1, p2);
}
int cbin () {
    int i , p = 0;
    for (i = 1; i <= 105; i <<= 1);
    while (i) {
        if (i + p <= 105 && verif (i + p) == 0) {
            p += i;
        }

        i >>= 1;
    }

    return p + 1;
}

int main() {
    f >> n >> l;
    for (int i = 1; i <= n; ++i) {
        f >> v[i].fi >> v[i].se;
    }

    ans = cbin ();
    g << ans << '\n';

    write ();
    return 0;
}