您的位置:首页 > 编程语言

编程之美--游戏之乐--1.4买书问题(改进解法)

2016-11-03 15:36 183 查看
原版解法以及改进解法均给出

改进解法思路展示:

假设输入为[7,6,5,4,3]
通过某个过程达到了[3,3,3,3,3]这种状态
那么这时候的结果res+=5*0.25*3即可
不需要继续执行下去
同理
如果出现了[0,3,3,3,3]这种状态
那么这时候的结果res+=4*0.2*3即可
不需要继续执行下去
因此程序存在优化空间
在此我只给出第一种其中下的优化解法
之后的优化同理可以写出来


原版解法

#coding=utf-8
#author='HL'

class Solution():
def solve(self,nums):
nums = sorted(nums)
res = self.in_Put(nums)
return 8*(sum(nums)-res)

def in_Put(self,nums):
#print nums#
'''
用作测试程序调用次数
输入为[7,6,5,4,3]时
该程序调用了2万次左右
'''

res = 0
if self.is_Equal(nums):
return 5*0.25*nums[0]

if nums[0]>0:
res = max(5*0.25+self.in_Put([ nums[i]-1 for i  in range(len(nums))]),res)
if nums[1]>0:
res = max(4*0.2+self.in_Put(sorted(nums[:1]+[nums[i]-1 for i in range(1,len(nums))])),res)
if nums[2]>0:
res = max(3*0.1+self.in_Put(sorted(nums[:2] + [nums[i] - 1 for i in range(2, len(nums))])), res)
if nums[3] > 0:
res = max(2*0.05+self.in_Put(sorted(nums[:3] + [nums[i] - 1 for i in range(3, len(nums))])), res)
return res

def is_Equal(self,nums):
for i in range(len(nums)-1):
if nums[i]!=nums[i+1]:
return False
return True

zz = Solution()
print zz.solve([2,2,2,1,1])


改进解法

#coding=utf-8
#author='HL'

class Solution():
def solve(self,nums):
nums = sorted(nums)
res = self.in_Put(nums)
return 8*(sum(nums)-res)

'''
假设输入为[7,6,5,4,3] 通过某个过程达到了[3,3,3,3,3]这种状态 那么这时候的结果res+=5*0.25*3即可 不需要继续执行下去 同理 如果出现了[0,3,3,3,3]这种状态 那么这时候的结果res+=4*0.2*3即可 不需要继续执行下去 因此程序存在优化空间 在此我只给出第一种其中下的优化解法 之后的优化同理可以写出来'''
def in_Put(self,nums):
#print nums#
'''
用作测试程序调用次数
输入为[7,6,5,4,3]时
该程序调用了3千次左右
'''

res = 0
if self.is_Equal(nums):
return 5*0.25*nums[0]

if nums[0]>0:
res = max(5*0.25+self.in_Put([ nums[i]-1 for i in range(len(nums))]),res)
if nums[1]>0:
newnums = sorted(nums[:1] + [nums[i] - 1 for i in range(1, len(nums))])
if self.is_Equal(newnums):
res = max(4 * 0.2 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(4 * 0.2 + self.in_Put(newnums), res)
if nums[2]>0:
newnums = sorted(nums[:2] + [nums[i] - 1 for i in range(2, len(nums))])
if self.is_Equal(newnums):
res = max(3 * 0.1 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(3 * 0.1 + self.in_Put(newnums), res)
if nums[3] > 0:
newnums = sorted(nums[:3] + [nums[i] - 1 for i in range(3, len(nums))])
if self.is_Equal(newnums):
res = max(2*0.05 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(2 * 0.05 + self.in_Put(newnums), res)
return res

def is_Equal(self,nums):
for i in range(len(nums)-1):
if nums[i]!=nums[i+1]:
return False
return True

zz = Solution()
print zz.solve([7,6,5,4,3])


通过改进算法,其实仍有更为优化的算法这里就不一一赘述
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程之美