E D R , A S I H C RSS

Ipsc Load Balancing

No older revisions available

No older revisions available




"""b.py Load Balancing
June Kim <juneaftn@hanmail.net>"""

from __future__ import generators
import unittest, shlex
from cStringIO import StringIO

def doAll(aString):
    lines=parseLines(aString)
    for eachLine in lines:
        yield getRounds(eachLine)

def parseLines(aString):
    stream=StringIO(aString)
    lexer=shlex.shlex(stream)
    numOfElements=int(lexer.get_token())
    total=[]
    while 1:
        thisLine=[]
        for i in range(numOfElements):
            thisLine.append(int(lexer.get_token()))
        yield thisLine
        numOfElements=lexer.get_token()
        if numOfElements=='-':
            break
        else:
            numOfElements=int(numOfElements)

def getSum(aList):
    return reduce(lambda x,y:x+y,aList,0)

class BalancingImpossibleException(Exception):
    pass

def getAvg(aList):
    sum=getSum(aList)
    if sum % len(aList):
        raise BalancingImpossibleException
    return sum/len(aList)

def getRounds(aList,aDebug=0):
    try:
        avg=getAvg(aList)
    except BalancingImpossibleException:
        return -1
    listLen=len(aList)
    totalSum=getSum(aList)
    last=0;leftSum=0;rightSum=totalSum
    for i in range(listLen):
        rightSum-=aList[i]
        last=min(leftSum-avg*i,rightSum-avg*(listLen-i-1),last)
        leftSum+=aList[i]
    return -last



class TestLoadBalancing(unittest.TestCase):
    def setUp(self):
        self.l=[[[6,0,9],4],
                [[0,9,6],5],
                [[0,6,9],5],
                [[2,3,5,6],3],
                [[0,1,4,3],3],
                [[16,17,15, 0,20, 1, 1, 2],23],
                [[16,17,15, 1,19, 1, 1, 2],23],
                [[16,17,15,10,10, 1, 1, 2],23],
                [[16,17,15,11, 9, 1, 1, 2],23],
                [[16,17,15,12, 8, 1, 1, 2],24],
                [[16,17,15,13, 7, 1, 1, 2],25],
                [[16,17,15,20, 0, 1, 1, 2],32],
                [[16, 1,15,20, 0, 1,17, 2],16],
                [[16, 1,15, 0,20, 1,17, 2], 7],
                [[17,18,16,21, 1, 2, 2, 3],32],
                [[0,0,100,0,0,0,0,0,0,0],70],
                [[0,0, 99,1,0,0,0,0,0,0],69],
                [[0,1,3,5,333,5,3,1,0],147 ],
                [[5,1,4,2,3,3,2,4,1,5,0,6],3],
                [[9,0,8,1,7,2,6,3,5,4,4,5,3,6,2,7,1,8,0,9],-1],
                [[17,9,4],7],
                [[6,94,3303,6921,94,105,8,7,77,4084,8,7,98,6,4,\
                  974,3,10,6,0,90,23],7459],
               ]
    def testGetRounds(self):
        for data,answer in self.l:
            actual=getRounds(data)
            self.assertEquals(answer,actual)

    def testParseLine(self):
        data="""\
3
0 1
3

2
5 1

-1"""
        expected=[[0,1,3],[5,1]]
        self.assertEquals(expected,list(parseLines(data)))

if __name__=='__main__':
    unittest.main(argv=('','-v'))

##################################################
"""runb.py Runner for b.py
June Kim <juneaftn@hanmail.net>

python runb.py <inputfile> <outputfile>
"""

import b,sys

if __name__=='__main__':
    f=open(sys.argv[1])
    fout=open(sys.argv[2],'wt')
    bgen=b.doAll(f.read())
    for each in bgen:
        print each
        fout.write("%s\n"%each)
    f.close()
    fout.close()


##################################################
## B1
##
## 147
## 3
## -1
## 7459
## 7
## 8564
#################################################
## B2
##
## 107829
## 24286
## 167437
##################################################
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.0113 sec