Greedy Gift Givers

We keep a dictionary data which stores the gifts given by each person. Then, we loop over all items in data, updating each person's money value as we go.

with open('gift1.in','r') as fin:
    n = fin.read().split('\n')
n.pop(-1) #Remove last newline
np = int(n[0])
names = n[1:np+1]
print names

data = {}
currentLine = np+1
while len(data) < np:
    money,numGifts = n[currentLine+1].split(' ')
    money = int(money)
    numGifts = int(numGifts)
    personData = [money,numGifts,n[currentLine+2:currentLine+numGifts+2]]
    data[n[currentLine]] = personData
    currentLine += numGifts+2

results = []
for i in names:
    results.append([i,0])
for name,values in data.items():
    results[names.index(name)][1] -= values[0]
    try:
        share = int(values[0])/values[1] # [money, numGifts, recipients]
        results[names.index(name)][1] += values[0]%values[1]
    except:
        print 'cheapskate!'
    for i in values[2]:
        results[names.index(i)][1] += share

print results #Congrats, me!

final = ''
for i in results:
    final+='%s %d\n' %(i[0],i[1])
with open('gift1.out','w') as fout:
    fout.write(final)