@Milo’s answer worked perfectly (see comment above).
if (in_array($post->ID, $do_not_duplicate)) continue;
meant that duplicate posts were still being counted in the loop, though not being displayed.
To fix, remove this line, and exclude duplicate posts from the query with this argument:
'post__not_in' => $do_not_duplicate
.
Thank you @Milo for your swift and succinct response.