Могу ли я дополнительно оптимизировать это решение для «Приготовления конфет» от HackerRank?

Мое решение 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;
    }
}

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *