买二赠一。

该文介绍了一种计算在特定促销规则下获取所有商品最低花费的方法,涉及排序和迭代优化算法。
摘要由CSDN通过智能技术生成

问题描述
某商场有N件商品,其中第件的价格是A。现在该商场正在进行“买二赠一”的优惠活动,具体规则是:每购买2件商品,假设其中较便宜的价格是P(如果两件商品价格一样,则P等于其中一件商品的价格),就可以从剩余商品中任选一件价格不超过的商品,免费获得这一件商品。可以通过反复购买2件商品来获得多件免费商品,但是每件商品只能被购买或免费获得一次。
小明想知道如果要拿下所有商品(包含购买和免费获得),全少要花费多少钱?
输入格式
第一行包含一个整数N
第二行包含N 个整数,代表 A1,A2,A3,...,AN。
输出格式
输出一个整数,代表答案
样例输入

7
1428571
样例输出
25

import os
import sys

# 请在此输入您的代码
n = int(input())
price = list(map(int, input().split()))
price.sort()

money = sum(price)

cnt = 0  #cnt 表示当前已经购买的商品数量
free = n - 1  #free 表示剩余可以享受折扣的商品索引

for i in range(n - 1, -1, -1):  #n-1是因为索引从0到n-1
    if price[i] == 0:
        continue

    if cnt == 0:  #一次要买两个,要跳过第一个价格高的
        cnt += 1
        continue

    half = price[i] // 2   #计算当前商品价格的一半
    while free >= 0 and price[free] > half:  #找出小于价格一半的免费商品
        free -= 1

    if free < 0:
        break

    money -= price[free]   #减去免费的钱
    price[free] = 0       #免费商品价格为0
    cnt = 0
    free = free - 1
print(money)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vsropy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值