DEV Community

Discussion on: Daily Challenge #230 - Beeramid

Collapse
 
roberthparry profile image
roberthparry • Edited

Here's my C solution,
Notice that there is no need for any iteration because (taking number of cans = N and number of levels = L)

N=1+22+32+...+L2=L(L+1)(2L+1)/6    L3/3<N<(L+1)3/3    L<(3N)1/3<L+1    L=(3N)1/3orL=(3N)1/31 N = 1 + 2^2 + 3^2 + ... + L^2 = L(L+1)(2L+1)/6 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \newline \implies L^3/3 < N < (L+1)^3/3 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \newline \implies L < (3N)^{1/3} < L+1 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \newline \implies L = \lfloor (3N)^{1/3} \rfloor \quad or \quad L = \lfloor (3N)^{1/3} \rfloor - 1 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad

int beeramid(double bonus, double price) {
    if (bonus < price) return 0;
    int cans = floor(bonus / price);
    int levels = floor(cbrt(3.0*cans));
    return levels*(levels + 1)*(2*levels + 1) > 6*cans ? levels - 1 : levels;
}
Enter fullscreen mode Exit fullscreen mode