100247F - Battle Fury
28 Jan 2021 — Tags: None
Click to show code.
using namespace std;
using ll = long long;
using predicate = function<bool(ll)>;
using vll = vector<ll>;
ll n, p, q;
vll a;
ll binary_search(ll lo, ll hi, predicate p)
{
while (lo < hi)
{
ll mid = lo + (hi - lo) / 2;
if (p(mid) == true)
hi = mid;
else
lo = mid + 1;
}
if (p(lo) == false)
return -1;
return lo;
}
bool hits_suffice(ll x)
{
ll total_hits;
if (p == q)
total_hits = (*max_element(a.begin(), a.end()) + p - 1) / p;
else
total_hits =
accumulate(a.begin(), a.end(), (ll)0, [x](ll acc, ll ai) -> ll {
ll ai_prime = ai - x * q;
ll p_prime = p - q;
return acc + max((ll)0, (ai_prime + p_prime - 1) / p_prime);
});
return x >= total_hits;
}
int main(void)
{
cin >> n >> p >> q;
a = vll(n);
for (auto &x : a)
cin >> x;
cout << binary_search(0, 1e9 + 11, hits_suffice) << endl;
return 0;
}