Cod sursa(job #2260987)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 15 octombrie 2018 20:15:05
Problema Lapte Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("lapte.in");
ofstream fo("lapte.out");

const int N = 105;

int dp[N][N], fst[N][N], a[N], b[N], ra[N], rb[N];

int n, milk;


static bool check(int tid) {
	memset(dp, 0xfe, sizeof dp);
	dp[0][0] = 0;

	for (int drunk = 1; drunk <= n; ++drunk) { // iteram betivul satului
		for (int pos = milk; pos >= 0; --pos)
		for (int s, f = 0; f * a[drunk] <= tid && f <= pos; ++f) {
			s = (tid - f * a[drunk]) / b[drunk];
			if (dp[drunk][pos] <= s + dp[drunk - 1][pos - f]) {
				fst[drunk][pos] = f;
				dp[drunk][pos] = s + dp[drunk - 1][pos - f]; } } }


	return dp[n][milk] >= milk; }


int main() {
	int tmp, idx, tid;

	fi >> n >> milk;
	for (int i = 1; i <= n; ++i)
		fi >> a[i] >> b[i];

	tid = 0;
	for (int msk = 1 << 20; msk > 0; msk/= 2) //check bound
		if (!check(tid + msk))
			tid+= msk;
	check(++tid);

	tmp = milk;
	for (int i = n; i >= 1; --i) {
		ra[i] = fst[i][tmp];
		rb[i] = (tid - fst[i][tmp] * a[i]) / b[i];
		tmp-= fst[i][tmp]; }

	fo << tid << '\n';
	for (int i = 1; i <= n; ++i)
		fo << ra[i] << ' ' << rb[i] << '\n';

	return 0; }