Hello guys :)
Today I tried to solve IOI 2015's first problem (Boxes with Souvenirs). I thought of dynamic programming:
dp[i] = min(dp[j] + min(l, 2 * (l - pos[j + 1]), 2 * pos[i])
( j >= i — k and j < i)
So this algo is O(N^2) and it time limit. My question is how to reduce it to O(N).
Thanks in advance :)
You can make use of the fact that there will be atmost one full circle in the optimal solution.
If there is more than one full-circle then we have given 2K souvenirs ( atmost ) and spent 2L seconds.
Now say X of these souvenirs lie on the left semicircle and Y of these souvenirs lie on the right semicircle. ( X + Y = 2K )
Observe that we could have gone clockwise(for X items) or anticlockwise(for Y items) and returned without completing a full circle for each case such that the sum of time taken would have been < 2L
( This is because we take L seconds atmost for one side and L-2 seconds for the other)
Now try to construct two DPs : one for clockwise and the other for anti-clockwise.
Let DP_CW[i] = Time taken to give first 'i' teams their souvenirs moving in a clockwise direction.
DP_CW[i] = DP_CW[i-K] + ( 2 * P[i] ) , if i >= K
DP_CW[i] = 2*P[i] , otherwise.
Similarly build DP_ACW[i] for anti-clockwise direction.
You can then merge these two DPs together considering the two cases separately . ( No Full Circle and One Full Circle )
This would work in time.
Code : Boxes with Souvenirs
Thanks a lot!
Lovely .. :)