Навык нахождения оптимального алгоритма можно натренировать решением любых задач в условиях ограничения каких-либо ресурсов. Скажем, для оптимизации по времени вашу задачу можно решить составлением ещё одного массива, где индексом будет количество очков, а содержимым элемента - позиция в таблице. Тогда задача будет решаться за линейное время O(n) за счёт увеличения расхода памяти.
Приведу пример на псевдокоде.
positions := array[0..max_scores] of 0
foreach of scores as score
positions[score] := 1
position := 1
for i := max_scores to 0
temp := position + positions[i]
positions[i] := position
position := temp
result := array[]
foreach of alice as score
result[] := positions[score]