Below is my solution for problem CMSocial - a social coding app. I finally got 100/100 after guessing. But I have a question.
It is about how exactly that we can use diffuser of the same kind in one room. There are two strategies:
A. We can use multiple diffusers of the same kind in one room in a day,
B. We can only use 1 diffuser per room per day.
I thought it is always strategy B based on the description, my original solution can only give me 20/100.
The current solution seems quite contradictory to me(since I guessed the solution)
In method f, m is the max value, which means we are following strategy B.
But in the meantime, we check d * k >= r, which means we are following strategy A.
An example,
P = 1, Q = 0, K = 2
bugs = [2, 4, 4]
Using strategy A, it is (4 + 4 + 2) / 2 = 5 days.
Using strategy B, it is 6 days.
Is my thinking process wrong?
#include <bits/stdc++.h>
using ll = long long;
ll ceil(ll a, ll b) {
return (a + b - 1) / b;
}
bool f(std::vector<ll> &v, ll n, ll p, ll q, ll k, ll d) {
ll r = 0;
ll m = 0;
for (ll i = 0; i < n; ++i) {
if (v[i] - d * q <= 0) continue;
ll t = ceil(v[i] - d * q, p);
r += t;
m = std::max(m, t);
}
return std::max(m, k == 0 ? d + r : ceil(r, k)) <= d;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
ll n, k;
std::cin >> n >> k;
ll p, q;
std::cin >> p >> q;
std::vector<ll> v(n);
for (ll i = 0; i < n; ++i) std::cin >> v[i];
if (q > p) {
std::swap(p, q);
k = n - k;
}
p -= q;
ll l = 0, r = (ll)1e9;
while (r - l > 1) {
ll m = l + (r - l) / 2;
if (f(v, n, p, q, k, m)) r = m;
else l = m;
}
std::cout << r << "\n";
return 0;
}