/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main
(String[] args
) { int n = 3;
long[] req = {1, 2, 3};
long[] stock = {10, 12, 14};
long[] cost = {2, 3, 5};
long budget = 100;
long result = findMaxProducible(n, req, stock, cost, budget);
System.
out.
println("Maximum number of units that can be produced: " + result
); }
public static long findMaxProducible(int n, long[] req, long[] stock, long[] cost, long budget) {
long low = 0;
long high = (long) 2e18;
long maxUnits = 0;
while (low <= high) {
long mid = low + (high - low) / 2;
if (mid == 0) {
low = mid + 1;
continue;
}
long currentCost = 0;
boolean possible = true;
for (int i = 0; i < n; i++) {
long requiredAmount = req[i] * mid;
long amountToBuy = 0;
if (requiredAmount > stock[i]) {
amountToBuy = requiredAmount - stock[i];
}
if (cost
[i
] > 0 && amountToBuy
> (Long.
MAX_VALUE - currentCost
) / cost
[i
]) { currentCost
= Long.
MAX_VALUE; break;
}
currentCost += amountToBuy * cost[i];
if (currentCost > budget) {
break;
}
}
if (currentCost <= budget) {
maxUnits = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
return maxUnits;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBpbnQgbiA9IDM7IAogICAgICAgIGxvbmdbXSByZXEgPSB7MSwgMiwgM307IAogICAgICAgIGxvbmdbXSBzdG9jayA9IHsxMCwgMTIsIDE0fTsgCiAgICAgICAgbG9uZ1tdIGNvc3QgPSB7MiwgMywgNX07IAogICAgICAgIGxvbmcgYnVkZ2V0ID0gMTAwOwoKICAgICAgICBsb25nIHJlc3VsdCA9IGZpbmRNYXhQcm9kdWNpYmxlKG4sIHJlcSwgc3RvY2ssIGNvc3QsIGJ1ZGdldCk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4aW11bSBudW1iZXIgb2YgdW5pdHMgdGhhdCBjYW4gYmUgcHJvZHVjZWQ6ICIgKyByZXN1bHQpOwogICAgfQogICAgcHVibGljIHN0YXRpYyBsb25nIGZpbmRNYXhQcm9kdWNpYmxlKGludCBuLCBsb25nW10gcmVxLCBsb25nW10gc3RvY2ssIGxvbmdbXSBjb3N0LCBsb25nIGJ1ZGdldCkgewogICAgICAgIGxvbmcgbG93ID0gMDsKICAgICAgICBsb25nIGhpZ2ggPSAobG9uZykgMmUxODsKICAgICAgICBsb25nIG1heFVuaXRzID0gMDsKCiAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgICAgIGxvbmcgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChtaWQgPT0gMCkgewogICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsb25nIGN1cnJlbnRDb3N0ID0gMDsKICAgICAgICAgICAgYm9vbGVhbiBwb3NzaWJsZSA9IHRydWU7CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgICAgbG9uZyByZXF1aXJlZEFtb3VudCA9IHJlcVtpXSAqIG1pZDsKICAgICAgICAgICAgICAgIGxvbmcgYW1vdW50VG9CdXkgPSAwOwoKICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZEFtb3VudCA+IHN0b2NrW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgYW1vdW50VG9CdXkgPSByZXF1aXJlZEFtb3VudCAtIHN0b2NrW2ldOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjb3N0W2ldID4gMCAmJiBhbW91bnRUb0J1eSA+IChMb25nLk1BWF9WQUxVRSAtIGN1cnJlbnRDb3N0KSAvIGNvc3RbaV0pIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29zdCA9IExvbmcuTUFYX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VycmVudENvc3QgKz0gYW1vdW50VG9CdXkgKiBjb3N0W2ldOwoKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29zdCA+IGJ1ZGdldCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoY3VycmVudENvc3QgPD0gYnVkZ2V0KSB7CiAgICAgICAgICAgICAgICBtYXhVbml0cyA9IG1pZDsKICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG1heFVuaXRzOwogICAgfQp9