I think the final points should be based on the "score" of the problem, not the rank.
Such as for one problem, four top students got:
20000000
19999999
19999998
19999997
... The little difference between them can't show us different levels but lucks I think, so maybe the point should be counted as:
C * socre/bestscore.