1) Move fast.
2) Pick up the drops.
3) Store the drops.
The internals are easy:
1) When you drive N meters, you score N.
2) When you drive over a drop of size 5, if you have internal storage left (a kart has a capacity of 100) you "upload" the drop and get 5 points into your scoring.
3) When you drive over a "storage" rectangle, if it still has free space, your internal storage is "downloaded" into the storage and you receive scoring for it.
The result is something like a group of ants collecting food and accumulating on some spots:
Basically we have modified step 1.3.3) in this pseudo-code:
1) For each option I can take (going left "value = -5" or going rigth "value = +5")
1.2) Imagine you take this option and simulate so you calculate the ending point after 0.1s.
1.3) From this point on, imagine 100 futures of 5 seconds by iterating:
1.3.1) Take a random decision (value = -5 + random*(-5+5))
1.3.2) Simulate so you get your new position after 0.1s more.
1.3.3) Calculate the micro-scoring of this movement by adding all goal's scoring (raced distance, drops collected, downloads, etc) and accumulate this scoring, so, when you reach the end of this future, you know its "scoring".
1.3.4) Stop when you have simulated 5 seconds in the future.
1.4) Now round the final points (x,y) of all 100 futures to a precision of 5: x=5*round(x/5)
1.5) Discard futures with the same end points so you end up with only different futures.
1.6) Score this option with Score=Sum(future.score ^2) for all the different futures found for this option.
2) Normalize the option's scores by:
2.1) Calculate AllScores = the sum. of the scores of all the options
2.2) Divide all option's scores by AllScores.
3) Intelligent decision = Sum. for all options( value * score )