CALC - Editorial

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

I just did this and it worked…


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.

TYSM vijju123! got it now :slight_smile:

@deadwing7 . The links for contest and practice are swapped.

The issue is corrected now. Thanks for pointing out ^^

1 Like

#define ll long long
using namespace std;
int main()
int t;
ll n,b;
ll val = n/b;
ll mid = val/2;
ll answer = mid (n - (midb));

–possibly the simplest solutions you can get

1 Like

the simplest one thank me later.

Your solution will become twice more appealing if you give a short summary of your thinking/what you did here. :smiley:

@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).

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;