【LeetCode题目详解】银联-02. 优惠活动系统(c++和python3)

目录

题目:

c++解法:

题意

思路

代码

代码详解:

python3解法:

算法描述:

代码:

代码详解:


题目:

「云闪付」作为各方联手打造的全新移动端统一入口,致力成为消费者省钱省心的移动支付管家。
请你设计一个「云闪付」优惠活动管理系统 DiscountSystem,具体功能如下:

  • AddActivity(int actId, int priceLimit, int discount, int number, int userLimit) -- 表示创建编号为 actId 的优惠减免活动:

    • 单笔消费的原价不小于 priceLimit 时,可享受 discount 的减免
    • 每个用户最多参与该优惠活动 userLimit 次
    • 该优惠活动共有 number 数量的参加名额
  • RemoveActivity(actId) -- 表示结束编号为 actId 的优惠活动

  • Consume(int userId, int cost) -- 表示用户 userId 产生了一笔原价为 cost 的消费。请返回用户的实际支付金额。

    • 单次消费最多可参加一份优惠活动
    • 若可享受优惠减免,则 「支付金额 = 原价 - 优惠减免」
    • 若同时满足多个优惠活动时,则优先参加优惠减免最大的活动

    注:若有多个优惠减免最大的活动,优先参加 actId 最小的活动

注意:

  • actId 全局唯一

示例 1:

输入:
["DiscountSystem","addActivity","consume","removeActivity","consume"]
[[],[1,15,5,7,2],[101,16],[1],[102,19]]

输出:[null,null,11,null,19]

解释:
DiscountSystem obj = DiscountSystem(); // 初始化系统
obj.addActicity(1,15,5,7,2); //创建编号 1 的优惠活动,单笔消费原价不小于 15 时,
可享受 5 的减免,优惠活动共有 7 个名额,每个用户最多参与该活动 2 次
obj.consume(101,16); //用户 101 消费了 16,满足优惠活动 1 条件,返回实际支付 16 - 5 = 11
obj.removeActivity(1); // 结束编号为 1 的优惠活动
obj.consume(102,19); //用户 101 消费了 19,目前不存在任何优惠活动,需按原价支付,返回 19

示例 2:

输入:
["DiscountSystem","addActivity","addActivity","consume","removeActivity","consume","consume","consume","consume"]
[[],[1,10,6,3,2],[2,15,8,8,2],[101,13],[2],[101,17],[101,11],[102,16],[102,21]]

输出:[null,null,null,7,null,11,11,10,21]

解释:
DiscountSystem obj = DiscountSystem(); // 初始化系统
obj.addActivity(1,10,6,3,2); // 创建编号 1 的优惠活动,单笔消费原价不小于 10 时,
可享受 6 的减免,优惠活动共有 3 个名额,每个用户最多参与该活动 2 次
obj.addActivity(2,15,8,8,2); // 创建编号 2 的优惠活动,单笔消费原价不小于 15 时,
可享受 8 的减免,优惠活动共有 8 个名额,每个用户最多参与该活动 2 次
obj.consume(101,13); // 用户 101 消费了 13,仅满足优惠活动 1 条件,返回实际支付 13 - 6 = 7
用户 101 参加 1 次活动 1,活动 1 剩余 2 个名额
obj.consume(101,8); // 用户 101 消费了 8,不满足任何活动,返回支付原价 8
obj.removeActivity(2); // 结束编号为 2 的活动
obj.consume(101,17); // 用户 101 消费了 17,满足优惠活动 1 条件,返回实际支付 17 - 6 = 11
用户 101 参加 2 次活动 1,活动 1 剩余 1 个名额

你可能感兴趣的:(Python学习,leetcode,c++,python,算法,数据结构)