I never thought that it would require parabola or derivatives, I just took some examples, found out what common technique worked for them, and the solution worked.
Too many of the solutions above have strange tests and conditionals. These are not really necessary, and the required effect can be handled in the division sum.
If x is the number of times button 2 is pressed, then the final score S is given by
S = x(N-Bx)
Using simple manipulation to complete-the-square gives
S = x(N-Bx)
= Nx-Bx^2
= B \left(\frac N {2B}\right)^2 - B \left(\frac N {2B} - x\right) ^2
To maximize S, we make \left| \frac N {2B} -x \right| as small as possible. The number of button presses x has to be an integer, so we seek the nearest integer to \frac N {2B}. Using the integer arithmetic of C, we set
x = \left\lfloor\frac {N+B} {2B}\right\rfloor
.
Hence a solution:
#include <bits/stdc++.h>
using namespace std;
int main( int argc, char ** argv )
{
uint32_t T,N,B;
cin >> T;
while (T--) {
cin >> N >> B;
uint64_t x = (N+B)/(B+B);
cout << x*(N-x*B) << endl;
}
return 0;
}
@dishant_18 actually when i was commenting codechef showed some error.I guess due to this reason i commented it thrice by mistake. I have removed it now Thanks:).
https://www.codechef.com/viewsolution/14444469
Ternary search is not much different from binary search only difference is that after reaching mid you have to check whether the right is smaller of greater than present value.
Also to apply ts you need to know which type of parabola it is.
Hope solution is clear.
Button A has cost 1. Button B has cost B.x is number of times button B is pressed. So points left for button A = N-x*B. So number of times A is pressed = (N-x*B)/1=N-x*b
@soheb17 that was a good observation. @vijju123 Actually In this question you will always get a maximum solution when you do half times 1 and remaining half do the other. You can notice this by custom inputs. What i mean to say is that in this question quadratic equation having roots first (no on the first) and second(no on the second) are equal.
In other words equal values has given extrema in this quadratic equation and so you know that how much to press on first and on second and you get the answer in O(1).
Problem is that in the equation he ignored the remainder of (N - x) / B. It is optimal to use the remainder in increasing number on first digit. If B * q + r = (N - x) then maximum answer should be q * (x + (N - x) - B * q) = q * (N - B * q) but this becomes equivalent to fixing the number of times second button was pressed.