ipc2 - 最优购物 purchase

最优购物 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()

在我这个代码上传后有大神给我指出了错误,我马上更正了,希望大家多多批评指正! 这次代码的格式也重新更正了一次,用了函数,结构更清晰、更加易读。

Selfishnessness

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))

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值