有趣的算法(1)-买等量香蕉最大化

描述


爱捣蛋的小宝贝是一个爱吃香蕉的强迫症。我要去水果店论筐买香蕉。 

现在水果店有好多筐香蕉,我的要求是买回来的每一筐里必须有相同数量的香蕉。

为了实现这个目标,你可以每次做两件事情。  
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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值