I'd say that the Droop Quota isn't very good when the quota is so small.

I agree, I'm not allocating seats in a real life election so this is just purely theoretical.

A more realistic quota for most elections would be in the thousands, so rounding up to the next integer would be a very small percentage difference. I think this is largely where the problem stems from.

So that's the core reason, makes sense to me.

But if we're going with 4 as the quota anyway, I think we're just minimising the amount over quota they go. So we have the following seats "owed" to each party:

That's pretty smart. This is the algorithm as I understand it:

If there are still seats remaining to elect, award seats to the party with the smallest difference between seats won and "party quota" (seats_won - votes / quota). Repeat until all seats filled

(For simplicity I'm breaking ties in favour of the first party)

So my example would start from the automatic seats [5, 6, 12]. Award seats based on the largest remainders method as usual, stopping when all parties has been awarded a seat: [6, 6, 12], [6, 6, 13], [6, 7, 13].

The remaining 4 seats would be filled like this

[7, 7, 13], [7, 7, 14], [7, 8, 14], [8, 8, 14]

Thank you very much for the help!