#Japt, 127 bytes * 80% * 75% * 50% = 38.1
Wow, that was one heck of a challenge to include all the bonuses. It could probably be made shorter.
D=[]N=Nn-;DpNr@Y-1¥Xg1 ?[Xg Y]:DpX ©[YY]}D;Ds1 £[BC]=Xms;B¥C?B:B+'-+CsBg ¦'-©Cl ¥Bl ©C¬r@B¯Z ¥C¯Z ªC-B§ApCl -Z ©ÂBsX <ÂCsX ?Z:X
Try it online!
###How it works
The explanation is very rough; don't hesitate to ask any questions you might have.
/* Setting up basic variables */
// Implicit: A = 10, N = list of input numbers.
D=[],N=Nn-; // D = empty array, N = N sorted by subtraction.
/* Finding ranges of page numbers */
Dp // Push into D the result of
NrXYZ{ // reducing each previous value X and item Y in N by this function,
}[]; // starting with an empty array:
Y-1==Xg1 ? // If Y is 1 more than the second item of X,
[Xg Y]: // return [X[0], Y].
DpX &&[YY] // Otherwise, push X into D and return [Y, Y].
/* Formatting result */
Ds1 mXYZ{ // Take the first item off of D and map each item X by this function:
[BC]=Xms; // Set B and C to the first to items in X as strings.
B==C?B // If B is the same as C, return B.
:B+'-+Cs // Otherwise, return B + a hyphen + C.slice(
Bg !='-&& // If B[0] is not a hyphen (B is not negative), AND
Cl ==Bl && // B and C are the same length,
/* Cutting off unnecessary digits */
Cq r // then C split into digits, reduced with
rXYZ{ // each previous value X, item Y, and index Z mapped by this function:
Bs0,Z ==Cs0,Z || // If B.slice(0,Z) equals C.slice(0,Z), OR
C-B<=ApCl -Z // C - B <= 10 to the power of (C.length - Z);
&&~~BsX <~~CsX // AND B.slice(X) is a smaller number than C.slice(X),
?Z:X // then Z; otherwise, X.
// Otherwise, 0.