#include <iostream>
#include <vector>
using namespace std;
// Extracted helper function to verify if target_units can be produced
bool can_produce(long long target_units, int n, const vector<int>& composition, const vector<int>& stock, const vector<int>& cost, int budget) {
long long total_cost = 0;
for (int i = 0; i < n; ++i) {
long long required_metal = target_units * composition[i];
if (required_metal > stock[i]) {
long long need_to_buy = required_metal - stock[i];
total_cost += need_to_buy * cost[i];
}
// Early exit if the running cost exceeds the budget
if (total_cost > budget) {
return false;
}
}
return true;
}
long long maxAlloys(int n, const vector<int>& composition, const vector<int>& stock, const vector<int>& cost, int budget) {
// Upper bound set slightly higher than max budget + max stock based on constraints
long long low = 0, high = 2e9;
long long max_units = 0;
// Binary Search execution
while (low <= high) {
long long mid = low + (high - low) / 2;
// Pass necessary arrays and variables to the outside function
if (can_produce(mid, n, composition, stock, cost, budget)) {
max_units = mid; // mid is possible, store it
low = mid + 1; // try searching for a larger amount
} else {
high = mid - 1; // mid is impossible, reduce target
}
}
return max_units;
}
int main() {
// Example test case
int n = 2;
vector<int> composition = {1, 2};
vector<int> stock = {0, 1};
vector<int> cost = {1, 1};
int budget = 3;
cout << "Maximum units of alloy: " << maxAlloys(n, composition, stock, cost, budget) << "\n";
// Expected output: 1
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEV4dHJhY3RlZCBoZWxwZXIgZnVuY3Rpb24gdG8gdmVyaWZ5IGlmIHRhcmdldF91bml0cyBjYW4gYmUgcHJvZHVjZWQKYm9vbCBjYW5fcHJvZHVjZShsb25nIGxvbmcgdGFyZ2V0X3VuaXRzLCBpbnQgbiwgY29uc3QgdmVjdG9yPGludD4mIGNvbXBvc2l0aW9uLCBjb25zdCB2ZWN0b3I8aW50PiYgc3RvY2ssIGNvbnN0IHZlY3RvcjxpbnQ+JiBjb3N0LCBpbnQgYnVkZ2V0KSB7CiAgICBsb25nIGxvbmcgdG90YWxfY29zdCA9IDA7CiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbG9uZyBsb25nIHJlcXVpcmVkX21ldGFsID0gdGFyZ2V0X3VuaXRzICogY29tcG9zaXRpb25baV07CiAgICAgICAgCiAgICAgICAgaWYgKHJlcXVpcmVkX21ldGFsID4gc3RvY2tbaV0pIHsKICAgICAgICAgICAgbG9uZyBsb25nIG5lZWRfdG9fYnV5ID0gcmVxdWlyZWRfbWV0YWwgLSBzdG9ja1tpXTsKICAgICAgICAgICAgdG90YWxfY29zdCArPSBuZWVkX3RvX2J1eSAqIGNvc3RbaV07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIEVhcmx5IGV4aXQgaWYgdGhlIHJ1bm5pbmcgY29zdCBleGNlZWRzIHRoZSBidWRnZXQKICAgICAgICBpZiAodG90YWxfY29zdCA+IGJ1ZGdldCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCmxvbmcgbG9uZyBtYXhBbGxveXMoaW50IG4sIGNvbnN0IHZlY3RvcjxpbnQ+JiBjb21wb3NpdGlvbiwgY29uc3QgdmVjdG9yPGludD4mIHN0b2NrLCBjb25zdCB2ZWN0b3I8aW50PiYgY29zdCwgaW50IGJ1ZGdldCkgewogICAgLy8gVXBwZXIgYm91bmQgc2V0IHNsaWdodGx5IGhpZ2hlciB0aGFuIG1heCBidWRnZXQgKyBtYXggc3RvY2sgYmFzZWQgb24gY29uc3RyYWludHMKICAgIGxvbmcgbG9uZyBsb3cgPSAwLCBoaWdoID0gMmU5OyAKICAgIGxvbmcgbG9uZyBtYXhfdW5pdHMgPSAwOwoKICAgIC8vIEJpbmFyeSBTZWFyY2ggZXhlY3V0aW9uCiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgICBsb25nIGxvbmcgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKICAgICAgICAKICAgICAgICAvLyBQYXNzIG5lY2Vzc2FyeSBhcnJheXMgYW5kIHZhcmlhYmxlcyB0byB0aGUgb3V0c2lkZSBmdW5jdGlvbgogICAgICAgIGlmIChjYW5fcHJvZHVjZShtaWQsIG4sIGNvbXBvc2l0aW9uLCBzdG9jaywgY29zdCwgYnVkZ2V0KSkgewogICAgICAgICAgICBtYXhfdW5pdHMgPSBtaWQ7ICAgLy8gbWlkIGlzIHBvc3NpYmxlLCBzdG9yZSBpdAogICAgICAgICAgICBsb3cgPSBtaWQgKyAxOyAgICAgLy8gdHJ5IHNlYXJjaGluZyBmb3IgYSBsYXJnZXIgYW1vdW50CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7ICAgIC8vIG1pZCBpcyBpbXBvc3NpYmxlLCByZWR1Y2UgdGFyZ2V0CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBtYXhfdW5pdHM7Cn0KCmludCBtYWluKCkgewogICAgLy8gRXhhbXBsZSB0ZXN0IGNhc2UKICAgIGludCBuID0gMjsKICAgIHZlY3RvcjxpbnQ+IGNvbXBvc2l0aW9uID0gezEsIDJ9OwogICAgdmVjdG9yPGludD4gc3RvY2sgPSB7MCwgMX07CiAgICB2ZWN0b3I8aW50PiBjb3N0ID0gezEsIDF9OwogICAgaW50IGJ1ZGdldCA9IDM7CgogICAgY291dCA8PCAiTWF4aW11bSB1bml0cyBvZiBhbGxveTogIiA8PCBtYXhBbGxveXMobiwgY29tcG9zaXRpb24sIHN0b2NrLCBjb3N0LCBidWRnZXQpIDw8ICJcbiI7CiAgICAvLyBFeHBlY3RlZCBvdXRwdXQ6IDEKCiAgICByZXR1cm4gMDsKfQ==