첫째 ¶
~cpp class AOI3nPlus1ProblemRunner: def getMaximumCycleLength(self, aFrom, aTo): max = 0 for i in range( aFrom, aTo + 1): cycleLength = self.getCycleLength(i) if max < cycleLength: max = cycleLength return max def getCycleLength( self, aStart ): n = aStart cycleLength = 1 while n is not 1: cycleLength = cycleLength + 1 if n % 2 is not 0: n = 3 * n + 1 else: n = n / 2 return cycleLength def run(self): numFrom = input("") numTo = input("") print self.getMaximumCycleLength(numFrom, numTo) ######################################################################### import unittest class AOI3nPlus1ProblemTestCase(unittest.TestCase): def setUp(self): self.runner = AOI3nPlus1ProblemRunner() def testGetMaximumCycleLength(self): self.assertEquals( 1, self.runner.getMaximumCycleLength( 1, 1 ) ) self.assertEquals( 20, self.runner.getMaximumCycleLength( 1, 10 ) ) self.assertEquals( 125, self.runner.getMaximumCycleLength( 100, 200 ) ) self.assertEquals( 89, self.runner.getMaximumCycleLength( 201, 210 ) ) self.assertEquals( 174, self.runner.getMaximumCycleLength( 900, 1000) ) def testGetCycleLength(self): self.assertEquals( 1, self.runner.getCycleLength(1) ) self.assertEquals( 5, self.runner.getCycleLength(16) ) self.assertEquals( 16, self.runner.getCycleLength(22) ) ######################################################################### if __name__ == '__main__': ## unittest.main() AOI3nPlus1ProblemRunner().run()
λμ§Έ ¶
~cpp import psyco MAXIMUM = 10000 class AOI3nPlus1ProblemRunner: def __init__(self): self.cycleLens = {} def getMaximumCycleLen(self, aFrom, aTo): maximum = 0 for i in range( aFrom, aTo + 1): if self.getCycleLen(i) > maximum: maximum = self.getCycleLen(i) self.cycleLens[i] = maximum return maximum def getCycleLen( self, n ): if n not in self.cycleLens: self.storeCycleLen( n ) return self.getStoredCycleLen(n) def run(self): numFrom = input("") numTo = input("") print self.getMaximumCycleLen(numFrom, numTo) def storeCycleLen(self, aN): n = aN cycleLen = 1 while n is not 1: if n in self.cycleLens: cycleLen = cycleLen + self.cycleLens[n] - 1 break cycleLen += 1 if n % 2 is not 0: n = 3 * n + 1 else: n = n / 2 self.cycleLens[aN] = cycleLen def getStoredCycleLen(self, aN): if aN not in self.cycleLens: return 0 return self.cycleLens[aN] ######################################################################### import unittest class AOI3nPlus1ProblemTestCase(unittest.TestCase): def setUp(self): self.runner = AOI3nPlus1ProblemRunner() def testGetMaximumCycleLen(self): self.assertEquals( 1, self.runner.getMaximumCycleLen( 1, 1 ) ) self.assertEquals( 20, self.runner.getMaximumCycleLen( 1, 10 ) ) self.assertEquals( 125, self.runner.getMaximumCycleLen( 100, 200 ) ) self.assertEquals( 89, self.runner.getMaximumCycleLen( 201, 210 ) ) self.assertEquals( 174, self.runner.getMaximumCycleLen( 900, 1000) ) def testGetCycleLen(self): self.assertEquals( 1, self.runner.getCycleLen(1) ) self.assertEquals( 5, self.runner.getCycleLen(16) ) self.assertEquals( 16, self.runner.getCycleLen(22) ) def testStoreCycles(self): self.assertEquals( 0, self.runner.getStoredCycleLen(0) ) self.runner.storeCycleLen(22) self.assertEquals( 16, self.runner.getStoredCycleLen(22) ) def testTime(self): # goal = 999,999 in 4 sec self.runner.getMaximumCycleLen(1,MAXIMUM) ## self.runner.getCycleLen(MAXIMUM) self.runner.storeCycleLen(MAXIMUM) ######################################################################### if __name__ == '__main__': psyco.full() unittest.main(argv=('','-v')) ## AOI3nPlus1ProblemRunner().run()
μ μ§Έ ¶
~cpp # 45m after tuning # total = 3h 11m 11s import unittest TEST_MAX = 100000 MAX = 1000000 ##TEST_MAX = MAX - 1 storedCycleLens = [0] * MAX CUTOFF = 100 def preProcessing(): i = 1 cycleLen = 1 while i < MAX: storedCycleLens[i] = cycleLen cycleLen += 1 i *= 2 def getCycleLen(aN): n = aN result = 1 while n != 1: result += 1 if n % 2 != 0: result += 1 n = (3*n+1) / 2 else: n /= 2 if n < MAX and\ storedCycleLens[n] != 0: result += storedCycleLens[n] - 1 break ## if getStoredCycleLen(n) is not 0: ## return getStoredCycleLen(n) + result - 1 return result def storeCycleLen(aN): storedCycleLens[aN] = getCycleLen(aN) def getStoredCycleLen(aN): if aN < 0 or aN >= MAX: return 0 return storedCycleLens[aN] def getMaxCycleLen(aStart, aEnd): maximum = 0 interval = 1 if CUTOFF < aEnd - aStart: interval = 2 if aStart % 2 == 0: aStart -= 1 for n in range(aStart, aEnd+1, interval): cycleLen = getCycleLen(n) if maximum < cycleLen: maximum = cycleLen storedCycleLens[n] = cycleLen return maximum class MyTestCase(unittest.TestCase): def testGetCycleLen(self): tests = [(1,1), (9,20), (16,5), (MAX-1,259)] for n, expected in tests: self.assertEquals( expected, getCycleLen(n) ) for n in range(MAX-1000, MAX): getCycleLen(n) def testgetMaxCycleLen(self): tests = [(1,1,1), (1,16,20), (900,1000,174), (1,1000,179)] for start, end, expected in tests: self.assertEquals(expected, getMaxCycleLen( start, end ) ) def testStoreCycleLen(self): tests = [(1,1), (16,5), (MAX-1,259)] for n, expected in tests: storeCycleLen( n ) self.assertEquals( expected , getStoredCycleLen(n) ) def testTime(self): getMaxCycleLen(1, TEST_MAX) ## self.assertEquals(525, getMaxCycleLen(1, MAX)) if __name__ == '__main__': preProcessing() ## unittest.main() timeTest = MyTestCase("testTime") runner = unittest.TextTestRunner() runner.run(timeTest)
Thread ¶
μ λ μ½μ§ μμ λ¬Έμ μλ€. μμ§ μνμκ°μ΄ ν±μμ΄ κΈΈλ€. μ¬μ ν λ©€λ²λ₯Ό μ΄μ©ν΄ κ³μ°νλ λΆλΆμ μ μ₯ν΄λμ΄ λ€μ μ°λλ‘ νμλ€. λ΅λ΅νλ€. PsyCoλΌλ λͺ¨λμ μλ‘κ² μμκ²λμλ€. --Leonardong
μ μ§Έ μ½λμμ ν΄λ³Έ μλ‘μ΄ μλλ λ€μκ³Ό κ°λ€.
μ μ§Έ μ½λμμ ν΄λ³Έ μλ‘μ΄ μλλ λ€μκ³Ό κ°λ€.
- MAX(100000)κ°μ μμλ₯Ό κ°μ§ 리μ€νΈμ κ³μ°νλ CycleLengthλ₯Ό μ μ₯νλ€.
- 3n+1μ νμ μ§μμ΄λ―λ‘ μ§μ κ²μ¬λ₯Ό ν λ² κ±΄λλ΄λ€.
- 2μ μ κ³±μλ€μ CycleLengthλ₯Ό μμν μ μμΌλ―λ‘ μ
λ ₯ λ°κΈ° μ μ 미리 κ³μ°ν΄λλ€.
- CycleLengthλ₯Ό ꡬνλ κ³Όμ μμ nμ΄ μ§μμΌ λλ§ μ μ₯λ κ°μ΄ μλμ§λ₯Ό κ²μ¬νλ€.
- ꡬνλ λ²μκ° Cutoffλ³΄λ€ ν¬λ©΄ μμνλ μκ° νμμΌ λ CycleLengthκ° ν΄ κ²μ΄λ―λ‘ νμλΆν° μμν΄μ μ§μλ 무μνκ³ κ΅¬νλ€.
νμ μ΄ κ°μ§ μλ cutoffλΆλΆμ λΉΌλλΌλ PsyCoλ₯Ό μ°λ©΄ 2μ΄ μμ ν΅κ³Όνλ€. 3μκ° λμ 10μ΄ μ λλ₯Ό μ€μλλ°, 10λΆλ§μ 10μ΄λ₯Ό μ€μλ€. μκ°μ μ€μ¬μΌ νλλ° μ λ§ μκ° μ λ μ€λ₯΄λ©΄ PsyCoκ° κ½€ λμμ΄ λ κ²μ΄λ€. λ¨μ©μ μ‘°μ¬ν΄μΌκ² λ€.--Leonardong