Cod sursa(job #3142946)

Utilizator mihai.alphamihai craciun mihai.alpha Data 26 iulie 2023 11:18:55
Problema Lapte Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n, l;

struct tripl  {
	int a, b, i;
	bool operator <(const tripl &oth)  {
		return this->a * oth.b < oth.a * this->b;
	}
};

tripl v[102];
tripl ans[102];

inline bool ver(int t)  {
	int l1 = l, l2 = l;
/*	for(int i = 1;i <= n;i++)  {
		if(l1 >= t / v[i].a)  {
			l1 -= t / v[i].a;
			int rest = t % v[i].a;
			ans[v[i].i] = {t / v[i].a, rest / v[i].b, v[i].i};
			l2 -= rest / v[i].b;
		}
		else  {
			int rest = t - l1 * v[i].a;
			ans[v[i].i] = {l1, rest / v[i].b, v[i].i};
			l1 = 0;
			l2 -= rest / v[i].b;
		}
	}  */
	for(int i = 1;i <= n;i++)  {
		int cant1 = min(t / v[i].a, l1);
		int cant2 = (t - cant1 * v[i].a) / v[i].b;
		ans[v[i].i] = {cant1, cant2, v[i].i};
		l1 -= cant1;
		l2 -= cant2;
	}
	if(l1 <= 0 && l2 <= 0)
		return 1;
	return 0;
}

int main()  {
	fin >> n >> l;
	for(int i = 1;i <= n;i++)
		fin >> v[i].a >> v[i].b, v[i].i = i;
	sort(v + 1, v + n + 1);
	int pas = 128, r = -1;
	while(pas)  {
		if(100 - (r + pas) >= 0 && ver(100 - (r + pas)))  {
			r += pas;
		}
		pas >>= 1;
	}
	int t = 100 - r;
	if(t > 100 || t < 1)  {
		int aa = 1;
		while(1)  {
			aa = aa + aa;
			aa /= 2;
			aa *= 2;
			aa /= 2;
		}
	}
	fout << t << "\n";

	for(int i = 1;i <= n;i++)
		fout << ans[i].a << " " << ans[i].b << "\n";
 	return 0;
}