AcWing 25. 剪绳子——python贪心解法
原题链接
简单
作者:
徐扬
,
2019-06-13 01:49:26
,
所有人可见
,
阅读 2058
class Solution(object):
def maxProductAfterCutting(self,length):
"""
题目解析:
用来找一个剪绳子的方案,使得减绳子之后的每段乘积大于当前绳子总长度
解法:n表示绳子总长度,m表示剪绳子的段数
1.如果绳子总长度<4,那么减绳子之后的乘积小于绳子总长度
2.如果绳子总长度=4,那么可以将绳子减为2段,此时每段乘积和总长度相等
3.如果绳子总长度>=5,那么剪绳子的乘积肯定存在某个值大于绳子总长,可以证明2(n-2)>n并且3(n-3)>n。而且3(n-3)>=2(n-2)。所以我们应该尽可能地多剪长度为3的绳子段,长度为2的绳子最多2段,不要留绳子长度为1的
:type length: int
:rtype: int
"""
# 边界判断
if length<2:return 0
if length==2:return 1
if length==3:return 2
#其他情况,如果总的绳子长度=4,那么效果一样,最大乘积都是4
#如果绳子长度>=5,那么需要尽可能的多剪成长度为3的子绳子段,然后长度为2的绳子最多2段,不要留绳子长度为1的
timesOf3=length//3
if (length-timesOf3*3)==1:#length=4,7,10,如果是10=3*3*3*1或者3*()
timesOf3-=1
timeOf2=(length-timesOf3*3)//2
result=pow(3,timesOf3)*pow(2,timeOf2)
return result