text: #!/usr/bin/python
  #
  # This script takes dues in input (std input) and compute an optimum
  # list of refunds.
  # Format of input list (a negative is a due)
  # John -10
  # Jack +20
  # Jessie -
  # 
  # If the sum is not equal to zero, the algorithm never stops.
  
  import sys
  
  # CONSTANTS
  BALANCE_THRESHOLD = 0.02
  
  # Init map of dues
  dues = {}
  
  # Read std in
  for line in sys.stdin :
      # Split into two parts
      (name, due) = line.strip().split()
  
      # Fill the map of dues
      dues[name] = float(due)
  
  
  # Init list of refunds (from, to, sum)
  refunds = []
  
  # Loop until the balance is reached
  while True :
      
      # Get the min/max due
      maxName = max(dues, key=dues.get)
      minName = min(dues, key=dues.get)
  
      # Min == Max ?? => exit
      if minName == maxName : break
  
      # Get dues
      minDue = dues[minName]
      maxDue = dues[maxName]
  
      # What can we exchange ?
      maxRefund = min(abs(minDue), abs(maxDue))
  
      # Balance reached ?
      if maxRefund <= BALANCE_THRESHOLD : break
  
      # Add a refund
      refunds.append((minName, maxName, maxRefund))
  
      # Update dues
      dues[minName] += maxRefund
      dues[maxName] -= maxRefund
     
  # Print refunds
  for (fromName, toName, refund) in refunds :
      print "%s => %s : %.2f" % (fromName, toName, refund)  
  