最优购物 purchase
Description
哪个人不喜欢喝可乐呢?作为可乐的爱好者,Leaf 每天都需要喝 1 瓶可乐。而且 Leaf 喜欢在可乐便宜的时候屯一些可乐,来减少买可乐的开销。
假设 Leaf 可以预知nn天内每天一瓶可乐的价格p_ipi。且一瓶可乐买回来最多只能放置dd天,如果超过dd天,Leaf 将不愿意喝这瓶可乐。形式化的表述是:设一瓶可乐在BB天被购买,则它必须在[B,B+d)[B,B+d)天中被喝掉,当天数大于等于B+dB+d时就不能喝了。请你帮 Leaf 求出如何购买可乐才能够使总花费最少。
Input
第一行包含两个正整数n \ (1 \leq n \leq 10^5)n (1≤n≤105)和d \ (1 \leq d \leq n)d (1≤d≤n),表示总天数和可乐最多放置的天数。
第二行包含nn个正整数p_i \ (1 \leq p_i \leq 10^4)pi (1≤pi≤104),表示nn天中每天一瓶可乐的价格。
Output
输出一行一个整数,表示答案。
Sample Input 1
7 3 3 2 2 1 3 3 1
Sample Output 1
11
Hint
一个可行的方案是:前三天 Leaf 每一天都买一瓶可乐当天喝掉,共花费3+2+2=73+2+2=7;第四天可乐比较便宜,所以可以一次性买33瓶,在第四~六天内每天喝掉一瓶,共花费1 \times 3 = 31×3=3。第七天再买一瓶。
因此最小总花费是7+3+1=117+3+1=11。
Reference Answer
def main():
N, M = input().split(' ')
N = int(N)
M = int(M)
ans = N * [10 ** 4]
output = 0
price = input().split(' ')
for i in range(len(price)):
if ans[i] > int(price[i]):
days = min(N - i, M)
ans[i: i + days] = [int(price[i])] * days
output += int(ans[i])
print(output)
if __name__ == "__main__":
main()
在我这个代码上传后有大神给我指出了错误,我马上更正了,希望大家多多批评指正! 这次代码的格式也重新更正了一次,用了函数,结构更清晰、更加易读。
what i want to be:3,2,1,2,3,10,10 ,如果在这种情况下,您的算法就会有纰漏,后三天明显该在价格为3的时候囤积可乐,但算法会直接在第三天买三瓶“价格为1”的可乐,然后最后俩天买价格为10的可乐。这不合理。
Debug Alpha
def best_purchase(N, M, price):
ans = N * [10 ** 4]
output = 0
for i in range(len(price)):
for j in range(min(len(ans) - i, M)):
if ans[i + j] > int(price[i]):
ans[i + j] = int(price[i])
output += int(ans[i])
return output
N, M = input().split(' ')
N = int(N) # 天数
M = int(M) # 可乐存放时间
price = input().split(' ')
print(best_purchase(N, M, price))