Мое решение C ++ для Проблема «Приготовления конфет» в HackerRank, воспроизведенный ниже, оптимизирован настолько, насколько я могу его сделать, и похож на то, что другие называют оптимальными решениями. Однако шесть тестовых случаев по-прежнему терпят неудачу из-за тайм-аута. Мне было бы интересно узнать, есть ли какие-либо существенные возможности для оптимизации моего кода, которые я упустил.
Я предполагаю, что мне либо не хватает способа упростить вычисление (возможно, его часть можно предварительно вычислить и сохранить в таблице поиска?), Либо есть способ вычислить ответ без использования цикла.
std::ios::sync_with_stdio(false);
long m, w, p, n;
std::cin >> m >> w >> p >> n;
for (long candies = 0, passes = 0, total = LONG_MAX; ; ++passes) {
const auto production = __int128{m} * w;
const long goal = n - candies;
const long passes_needed = goal/production + !!(goal%production);
const long subtotal = passes + passes_needed;
if (passes_needed <= 2) {
std::cout << subtotal;
return 0;
}
if (total < subtotal) {
std::cout << total;
return 0;
}
total = subtotal;
candies += production;
if (candies >= p) {
const auto d = std::div(candies, p);
long budget = d.quot; candies = d.rem;
const long diff = w - m;
if (diff < 0) {
const long w_hired = std::min(budget, -diff);
budget -= w_hired;
w += w_hired;
} else if (diff > 0) {
const long m_purchased = std::min(budget, diff);
budget -= m_purchased;
m += m_purchased;
}
const long half = budget >> 1;
m += half + (budget & 1);
w += half;
}
}