Skip to content

Instantly share code, notes, and snippets.

@robket
Last active August 29, 2015 14:09
Show Gist options
  • Save robket/7c5b302f23a04b3e0f1e to your computer and use it in GitHub Desktop.
Save robket/7c5b302f23a04b3e0f1e to your computer and use it in GitHub Desktop.
GreedyPirates
import math
def distributionWithNPirates(n):
if (n == 1): # Base case
return [100]
numberOfVotesRequired = int(math.ceil(n / 2.0))
# Pirate n will vote for his proposal regardless
numberOfVotesRequired -= 1
distributionIfPirateNKilled = distributionWithNPirates(n - 1)
piratesThatGetTheLeastIfPirateNIsKilled = sorted(range(len(distributionIfPirateNKilled)), key=distributionIfPirateNKilled.__getitem__)
minimumDistribution = [0] * (n - 1)
totalBribes = 0
for pirateToBribe in piratesThatGetTheLeastIfPirateNIsKilled[:numberOfVotesRequired]:
bribeAmount = distributionIfPirateNKilled[pirateToBribe] + 1
minimumDistribution[pirateToBribe] = bribeAmount
totalBribes += bribeAmount
remainderForPirateN = 100 - totalBribes
minimumDistribution.append(remainderForPirateN)
return minimumDistribution
import sys
n = int(sys.argv[1])
print distributionWithNPirates(n)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment