吃烧饼

阿里校招笔试题

题目描述:现在有N个盘子,第 i 个盘子放了 si 个烧饼,小明可以任意选一个数字 x,x介于 1 和 N 之间,他可以从 1 到 x之间的盘子吃一个烧饼。如果 1 到 x 个盘子中有一个盘子没有烧饼,那么他不能选择这个 x。 假设小明胃口无限大,求小明能吃的最多的烧饼数量。

input:
3
2 1 3

output:
4

样例解释:其实很容易想到要从最后一个盘子开始做选择,先选了3号盘子的话,每个盘子吃掉一个烧饼一共吃掉三个,这个时候每个盘子烧饼数目变成1,0,2,下一步在做选择的时候就只能选择1号盘子吃掉一个烧饼了,所以一共吃掉四个烧饼。

按照这样从后先前模拟确实也可以,但是不够优化,其实可以发现选择每个盘子可以吃掉的烧饼数目取决于当前盘子的烧饼和前面所有盘子烧饼数目的最小值,这样求出每个盘子可以吃的烧饼数目在累加起来就好了,也可以做到从前往后推更加简洁,

很多时候虽然从后向前推思路可能会更加直接,这个时候不妨想想怎么从前往后推,或者会使得整个思路更加简洁。

n = input()
s = input().split()
nums = [int(i) for i in s]

min_num, res = nums[0], 0
for i in range(len(nums)):
    min_num = min(min_num, nums[i])
    res += min_num
print(res)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值