网易首页 > 网易号 > 正文 申请入驻

2026-11-03:应用折扣后的最低总价。用go语言,有商品价格数组和折扣百分比数组。价格数组中的每个元素表示一件商品的标价,折扣数组中的

0
分享至

2026-11-03:应用折扣后的最低总价。用go语言,有商品价格数组和折扣百分比数组。价格数组中的每个元素表示一件商品的标价,折扣数组中的每个元素表示一种可选的降价比例。分配折扣时需满足:一种折扣最多作用于一件商品,一件商品最多接受一种折扣,商品也可以不参与折扣。若某商品原价为 p,使用百分比为 d 的折扣,则结算价按 p 乘以(100 减 d)再除以 100 计算,结果保留精确值,不做四舍五入。目标是合理选择哪些商品使用哪些折扣,使全部商品的结算价总和尽可能小,并返回这个最小总和。答案允许存在一定数值误差,绝对或相对误差在 10 的负 5 次方以内均可接受。

1 <= prices.length, discounts.length <= 100000。

1 <= prices[i] <= 100000。

1 <= discounts[j] <= 100。

输入: prices = [10,30,21], discounts = [50,60]。

输出: 32.50000。

解释:

将 discounts[1] = 60 应用于 prices[1] = 30,则最终价格为 30 * (100 - 60) / 100 = 12。

将 discounts[0] = 50 应用于 prices[2] = 21,则最终价格为 21 * (100 - 50) / 100 = 10.5。

prices[0] = 10 不使用折扣,因此价格仍为 10。

总价为 12 + 10.5 + 10 = 32.50000,这是可能得到的最小值。

题目来自力扣4014。

分步骤描述过程

  1. 1.理解目标

  • • 对每个商品,可以选择不使用折扣,或使用某一个折扣。

  • • 每个折扣最多用一次,每件商品最多用一个折扣。

  • • 若商品原价为p,使用折扣百分比为d,则折后价为
    p * (100 - d) / 100。

  • • 目标是让所有商品的折后价总和最小。

  • • 因为总原价固定,所以等价于让“节省的总金额”最大。某商品使用折扣d节省的金额是p * d / 100。因此价格越高的商品,越应该搭配越大的折扣。

2.对价格数组降序排序

  • • 代码首先把prices按从大到小排序。

  • • 排序后,价格最高的商品排在最前面。

  • • 这样后续可以优先给高价格商品分配较大的折扣。

3.对折扣数组降序排序

  • • 代码同样把discounts按从大到小排序。

  • • 排序后,折扣力度最大的折扣排在最前面。

  • • 折扣百分比越大,表示降价越多。

4.按顺序一一配对

  • • 遍历排序后的价格数组。

  • • 对于第i个价格:

    • • 如果i还没有超过折扣数组长度,就取排序后第i个折扣,即当前可用的最大折扣,分配给当前价格。

    • • 如果折扣已经用完,则当前商品不使用折扣,等价于折扣百分比为0。

  • • 因为价格和折扣都按降序排列,所以实际上就是:

    • • 最高价格配最大折扣;

    • • 第二高价格配第二大折扣;

    • • 依此类推;

    • • 折扣数量不足时,剩余商品原价结算;

    • • 折扣数量多于商品数量时,多出来的折扣不使用。

5.累加折后价格的“百分比分子”

  • • 对每个商品,代码没有立即做除法,而是先计算:

    • •p * (100 - d)

  • • 这相当于该商品折后价乘以100后的结果。

  • • 把所有商品的这个值累加到ans中。

  • • 这样做可以避免每件商品单独除法带来的浮点误差,最后只做一次除法。

6.最后一次性转换为实际总价

  • • 遍历结束后,ans表示所有商品折后总价乘以100的结果。

  • • 最后返回ans / 100的浮点结果。

  • • 因为除法只在最后做一次,所以精度较好,符合题目允许误差的要求。

7.示例验证

  • • 输入价格:[10, 30, 21]

  • • 输入折扣:[50, 60]

  • • 价格降序后:[30, 21, 10]

  • • 折扣降序后:[60, 50]

  • • 配对:

    • •30配60,折后为30 * 40 / 100 = 12

    • •21配50,折后为21 * 50 / 100 = 10.5

    • •10没有折扣,折后仍为10

  • • 总价为12 + 10.5 + 10 = 32.5

  • • 与题目输出一致。

8.贪心为什么正确

  • • 假设有两个价格p1 >= p2,两个折扣d1 >= d2。

  • • 如果让大价格配大折扣,节省金额为:

    • •p1 * d1 + p2 * d2

  • • 如果反过来,小价格配大折扣,节省金额为:

    • •p1 * d2 + p2 * d1

  • • 两者之差为:

    • •(p1 - p2) * (d1 - d2)

  • • 因为p1 >= p2且d1 >= d2,所以这个差大于等于0。

  • • 因此,大价格配大折扣不会比反过来差,贪心策略正确。

时间复杂度

设价格数组长度为n,折扣数组长度为m。

  • • 对价格数组排序:O(n log n)

  • • 对折扣数组排序:O(m log m)

  • • 遍历价格数组累加:O(n)

因此总时间复杂度为:

O(n log n + m log m)

额外空间复杂度

  • • 算法没有创建与n或m同阶的新数组,排序是原地进行的。

  • • 但排序算法内部通常需要递归栈等辅助空间:

    • • 价格排序约O(log n)

    • • 折扣排序约O(log m)

  • • 因此若把排序内部栈计入,额外空间复杂度为:

O(log n + log m)

如果只统计代码中显式申请的额外数组空间,则除排序内部开销外为O(1)。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

func minPrice(prices, discounts []int)float64 {
slices.SortFunc(prices, func(a, b int)int { return b - a })
slices.SortFunc(discounts, func(a, b int)int { return b - a })

ans := 0
for i, p := range prices {
d := 0
if i < len(discounts) {
d = discounts[i]
}
ans += p * (100 - d)
}
returnfloat64(ans) / 100// 只做一次浮点运算
}

func main() {
prices := []int{10, 30, 21}
discounts := []int{50, 60}
result := minPrice(prices, discounts)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

from typing import List

def min_price(prices: List[int], discounts: List[int]) -> float:
prices = sorted(prices, reverse=True)
discounts = sorted(discounts, reverse=True)

ans = 0
for i, p in enumerate(prices):
d = discounts[i] if i < len(discounts) else0
ans += p * (100 - d)

return ans / 100

if __name__ == "__main__":
prices = [10, 30, 21]
discounts = [50, 60]
result = min_price(prices, discounts)
print(result)

C++完整代码如下:

  




double minPrice(std::vector prices, std::vector discounts) {
std::sort(prices.begin(), prices.end(), std::greater());
std::sort(discounts.begin(), discounts.end(), std::greater());

long long ans = 0;
for (size_t i = 0; i < prices.size(); ++i) {
int d = (i < discounts.size()) ? discounts[i] : 0;
ans += static_cast (prices[i]) * ( 100 - d);
}
return static_cast (ans) / 100.0; // 只做一次浮点运算
}

int main() {
std::vector prices = {10, 30, 21};
std::vector discounts = {50, 60};
double result = minPrice(prices, discounts);
std::cout << result << std::endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
随着温特1-4,张本美和1-4,WTT法兰克福冠军赛女单决赛2席诞生:日本女乒提前包揽冠军和亚军

随着温特1-4,张本美和1-4,WTT法兰克福冠军赛女单决赛2席诞生:日本女乒提前包揽冠军和亚军

侧身凌空斩
2026-11-08 19:51:29
1955 年授衔,陈赓看着自己的大将军衔,排在他前面的还有两位,一位拿着 五千大洋救中央,一位一封电报东北定全局

1955 年授衔,陈赓看着自己的大将军衔,排在他前面的还有两位,一位拿着 五千大洋救中央,一位一封电报东北定全局

磊子讲史
2026-11-04 16:56:40
APEC会议期间,对寄往深圳市辖区内的邮件快件,实施临时性安全管理措施

APEC会议期间,对寄往深圳市辖区内的邮件快件,实施临时性安全管理措施

深圳本地宝
2026-11-08 15:44:14
在蒙古工作的华人感慨:不要听媒体吹牛,蒙古相当于我国二线城市

在蒙古工作的华人感慨:不要听媒体吹牛,蒙古相当于我国二线城市

铭记历史呀
2026-11-08 20:11:00
苏州大三男生在宿舍靠一台电脑,凭制作AI漫剧营收超300万元,“团队5人7天曾一口气做3部漫剧”;有爆款播放量破15亿,单剧创收200多万元

苏州大三男生在宿舍靠一台电脑,凭制作AI漫剧营收超300万元,“团队5人7天曾一口气做3部漫剧”;有爆款播放量破15亿,单剧创收200多万元

安青传媒
2026-11-08 12:42:58
双十一没落了?23年销售额1.13万亿,24年1.44万亿,25年让人惊讶

双十一没落了?23年销售额1.13万亿,24年1.44万亿,25年让人惊讶

浩渺青史
2026-11-07 04:56:01
美国共和党专家:副总统万斯本是2028年大选共和党总统提名的最大热门,而如今情况已变得扑朔迷离

美国共和党专家:副总统万斯本是2028年大选共和党总统提名的最大热门,而如今情况已变得扑朔迷离

极目新闻
2026-11-08 22:10:42
2-3!随着耻辱性丢冠,成都蓉城揪出三大“罪臣”,韦世豪真难辞其咎

2-3!随着耻辱性丢冠,成都蓉城揪出三大“罪臣”,韦世豪真难辞其咎

大卫的篮球故事
2026-11-08 18:39:00
1992年泰森服刑期间和女狱警发展私情,不久女方意外怀孕,泰森托狱外朋友带她去堕胎,高墙深处藏着怎样的权色迷局?

1992年泰森服刑期间和女狱警发展私情,不久女方意外怀孕,泰森托狱外朋友带她去堕胎,高墙深处藏着怎样的权色迷局?

磊子讲史
2026-10-29 18:02:22
巨亏408亿!五大险企爆雷,真相彻底反转:卖保险根本不亏钱

巨亏408亿!五大险企爆雷,真相彻底反转:卖保险根本不亏钱

江启
2026-11-08 13:42:48
她没带走冠军,但她带走了尊重:张本美和这三十秒应该被记住

她没带走冠军,但她带走了尊重:张本美和这三十秒应该被记住

好叫好伐
2026-11-05 19:25:04
“白大拿”:立即飞往华盛顿,与特朗普面谈

“白大拿”:立即飞往华盛顿,与特朗普面谈

极目新闻
2026-11-08 11:46:00
一夜变天!执政32年的非国大跌落神坛,选民用选票完成集体报复

一夜变天!执政32年的非国大跌落神坛,选民用选票完成集体报复

白日追梦人
2026-11-08 14:37:56
为什么中国和俄国的历史学界,都认为《尼布楚条约》是自家吃亏?

为什么中国和俄国的历史学界,都认为《尼布楚条约》是自家吃亏?

文史道
2025-12-22 13:29:06
广州市民投诉:在知名川菜品牌一门店用餐,2岁宝宝吃出一块保鲜膜;官方:责令改正,罚款10000元

广州市民投诉:在知名川菜品牌一门店用餐,2岁宝宝吃出一块保鲜膜;官方:责令改正,罚款10000元

南方都市报
2026-11-08 22:04:47
遭禁赛缺战!31岁韦世豪霸气喊话全队:打泰山当决赛踢 必须全力以赴

遭禁赛缺战!31岁韦世豪霸气喊话全队:打泰山当决赛踢 必须全力以赴

我爱英超
2026-11-08 10:31:01
俄罗斯一亿五千万人,没见他们慌!美国三亿多人口,也没见他们愁!可中国坐拥十四亿人口,中国专家为什么偏偏先坐不住了

俄罗斯一亿五千万人,没见他们慌!美国三亿多人口,也没见他们愁!可中国坐拥十四亿人口,中国专家为什么偏偏先坐不住了

扶苏聊历史
2026-10-28 10:28:00
俄罗斯,实在撑不住了,1个月内,损失13架战机

俄罗斯,实在撑不住了,1个月内,损失13架战机

万里繁华
2026-11-06 09:16:05
实话说:俄罗斯对中国最大的贡献,就是让整个西方彻底误判了中国

实话说:俄罗斯对中国最大的贡献,就是让整个西方彻底误判了中国

经纬戎韬
2026-11-07 04:14:36
又一个释永信被查,高调开保时捷出庭,禅房挖出800公斤黄金白银

又一个释永信被查,高调开保时捷出庭,禅房挖出800公斤黄金白银

叨唠
2026-11-08 05:35:09
2026-11-09 06:00:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1564文章数 83关注度
往期回顾 全部

科技要闻

马斯克:“中国太棒了,我爱中国”

头条要闻

男子在会所杀死妻子等3人后自杀 杀人后曾举报会所涉黄

头条要闻

男子在会所杀死妻子等3人后自杀 杀人后曾举报会所涉黄

体育要闻

见证奇迹!中超冠军属于大连

娱乐要闻

敬一丹女儿追忆母亲:她被世界铭记

财经要闻

梁文锋攒了一个老乡局

汽车要闻

503.17km/h!中国超跑这次真把天花板捅穿了!

态度原创

艺术
手机
房产
家居
军事航空

艺术要闻

董其昌的学生、陈洪绶的老师,蓝瑛:古画圈的 “异类打工人”

手机要闻

被砍的2021款诺基亚G20 5G手机曝光:展锐T7520 + 4G RAM

房产要闻

最后十多套 这个海甸岛一线江景盘即将收官 有漏可捡!

家居要闻

2026建博会(广州) 公装联探展交流活动

军事要闻

被问四川舰跟福建舰未来能否形成一体战斗群 专家回应

无障碍浏览 进入关怀版