000006b251e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728 -> Chuck saves input for less difficulty
000000000000000058bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728 -> Chuck saves input for higher difficulty
000000000000000000000000ab0d51c6619f3e7a1a9f0e75838d41ff368f728 -> Chuck saves input for higher difficulty
000000000000000008bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728 -> Chuck saves input for higher difficulty
0000000051e67e8358bef8483ab0d51c6619f3e7a1a9f0e75838d41ff368f728 -> Bob gets off and claims prize.
Difficulty goes up to 16 zeros:
Chuck gives it to -> Alice -> gets Bob off in one stroke and Bob claims prize.
Chuck should be saving all difficulties within program parameters to easily give it to Alice so Alice can get Bob off in one stroke.
The extra steps will slow calculations but the end result will be to get Bob off more quickly.
If you are withholding the blocks instead of broadcasting it, by the time you broadcast that block, your block would have been orphaned. The block header contains the hash of the last block and since the chain is now longer, the nodes will orphan your block and follow the longest chain.
Eg. If I've got many hashes that has a high difficulty at block 20, the block header contains the hash of block 19. At 2016, i broadcast the blocks with the higher difficulty. Though the target matches, the hash of the last block is from block 19 and it will not continue to build on the longer chain(block height of 2016).