Note the following is not a proof:
Yet it can give some intuition,
f(n) = n+1 + f(n-x) + f(x), will have minima at x = n/2, u can find this by assuming f(n) to a polynomial function, and taking the derivative.
and f(n) is maximum at other two ends, that is either x = 1 or x = n-1, due to increasing both arms of parabola. (assuming the degree of polynomial f(n) is 2 ), again this is intuitive since the dip is at x=n/2.
f(n) starts decreasing as x increasing from 1 to n/2, reaches its minima when x = n/2, then again starts increasing.
@mkagenius - the equation in the first line of your explanation should be f(n)=(n+1)+f(x)+f(n-x-1).
Further, the statement “For maximum, we just need to place in the order {1,2,3…N}” seems fairly intuitive to me. (n*(n+3))/2 is easily derivable as being equal to ((n+1)+…+2).
Regarding the one regarding minLen[n], I also am having trouble finding a satisfactory proof for it. It is no doubt intuitive, but it would be great if someone could come up with a concrete proof for the same.
Let me put it this way - if the length of the wire to connect the ith soldier (meaning i-1 soldiers have already been stationed on the wall) be denoted by len[i], then one can easily see that len[i]>len[i+1]. Now, we know that len[1]=n+1. Hence, we can easily deduce that the max value for len[2] is n. Going on this way, the statement in question is evident.
, i think you already assumed that best placement permutation to be (1,2,3..,N) but that is the question, whether this particular permutation is best one or not.(or why do you think that to get maximum, that condition should be satisfied?).
See the constraints say that N<=30. Till N<=10, we can actually simulate the give procedure and display the different lengths we can incur. If we check that, we will come to know that all values will be taken. I mean it is an assumption but as 1/3 rd of the cases are going to satisfy it, we can give it a shot.
I am writing this for those who still not able to understand : why do we need sub problems to find min value. (Try using pen and paper)
For minimum, its always better to try partitioning the problem into two equal subproblems. minLen[n] = (n+1) + minLen[n/2] + minLen[n-1-n/2]
Based on the above statement we have to divide each sub-problem into 2 parts every-time for that we need recursion, you can check how the flow goes in the following diagram
For n=2, the min and max possible length of the rope required would be the same i.e. 5.
2 possible perm- [1,2], [2,1]. Going by the logic length of the rope required= 1+2+1+1 (can be easily seen through ques logic).
Hence rope of size=4 doesn’t work in any possible cases. Therefore -1.
#include<bits/stdc++.h>
int nokia(int l,int r)
{
if( r-l < 2) return 0;
int mid = l+(r-l)/2;
return (r-l) + nokia( l ,mid) + nokia(mid , r);
}
int main()
{
int t , n , l;
cin>>t;
while(t–)
{
cin>>n>>l;
int Max = (n*(n+1))/2 + n;
int Min = nokia(0 , n+1);
if( l <= Max && l >= Min) cout<<0<<endl;
else if(l < Min) cout<<-1<<endl;
else cout<<( l-Max )<<endl;
}
return 0;
}
We only need recursive function calculate minimum value and maximum can be calculated using sum of n numbers + n.