描述
爱捣蛋的小宝贝是一个爱吃香蕉的强迫症。我要去水果店论筐买香蕉。
现在水果店有好多筐香蕉,我的要求是买回来的每一筐里必须有相同数量的香蕉。
为了实现这个目标,你可以每次做两件事情。
1)放弃框里的一部分香蕉
2)连筐带香蕉放弃一整筐
我想知道我能得到最多多少香蕉。
输入
以空格分割的多个正整数,每个正整数表示一筐香蕉的总香蕉数
输出
最多能得到的香蕉数
输入样例
1 1 1 2 2 3 4
5 0 29 14
输出样例
8
29
我是学电子出身,对计算机系同学的数据结构和算法并没有进行过深入的学习,所以在此我们讨论的算法都以大家都能明白的方式,以最简单的、最清晰的方式去解决算法问题。
乍一看这个题目,觉得我从下手,难道需要多次遍历所有变量,每次取一个可能的值,在所有次的遍历之中取值最大的?这样我们就可能需要遍历N*N次(N是数据的长度)。
有没有更优的算法呢,最优的肯定是一次遍历就求出最大值,那怎么做呢,其实大家仔细再看看题目,如果是有序的数字,处理起来是不是方便一些呢?排序之后,比如输入样例1中,第一次遍历到的是1,可能就想到买到的N框都是1个香蕉,遍历到2时,我们会想,这个位置假设是i,(N-i)*2会不会比N*1大呢?然后记录下大的那个值,继续往后走,直到走到3的位置,跟上次比较类似,再记录一个最大值,如此直到遍历结束,记录的最大值也就是整个遍历的最大值,也就是我们的最佳购买方案。
废话少说,放码过来!
def buy_banana(input):
array=input.strip().split()
sort_input=[]
for single in array:
sort_input.append(int(single))
sort_input.sort()
length=len(sort_input)
i=0
begin=sort_input[i]
max=begin*length
for j in range(1,length):
if sort_input[j] != begin:
current=sort_input[j]
current_max=current*(length-j)
if current_max>max:
max=current_max
return str(max)
if __name__ == '__main__':
intput="5 0 29 14";
buy_banana(intput)