商城双11大促销 - 华为机试真题题解

2024-03-03 13:36

本文主要是介绍商城双11大促销 - 华为机试真题题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

考试平台: 时习知

分值: 300分(第三题)

考试时间: 两小时(共3题)

alt

题目描述

商城双11大促销,每种商品限购两件。一共有M种商品。每种商品的原始价格为X元。

买一件折扣价是Y元,买两件折扣价是Z元。其中X>=Y>=Z。

小明银行卡里有余额N元。在N元的范围内怎么购买商品才可以获得最多的优惠金额?

输入

第1行: 商品种类M,M的范围是[1-20]。

第2到M+1行: 每个商品的原始价格X元,购买一件的折扣价Y元,购买两件的折扣价Z元。X、Y、Z的范围是[1-1000]。

第M+2行: 小明银行卡余额N元。N的范围是[1-20000],N元至少可以购买一件商品。

输出

输出可以获得的最多优惠金额

示例1

输入:
2
10 8 6
8 6 6
20输出:
10解释: 
第一个商品买2件,第二个商品买1件。总共花费2*6+6=18元在20元范围内。第一件商品优惠8元(2件),第二件商品优惠2元(1件)。总共优惠10元。

示例2

输入:
3
10 8 4
20 17 13
30 20 10
50输出:
55解释: 
第一个商品买2件,第二个商品买1件第三个商品买2件。总共花费 24+17+210=41元在50元范围内。
第一件商品优惠12元(2件),第二件商品优惠3元(1件),第三件商品优惠40元(2件),总共优惠55元。

题解

这段 C++ 代码使用了动态规划的方法解决了问题。以下是对代码的一些解释:

  • X[i] 表示第 i 种商品的原价,Y[i] 表示购买一件的折扣价,Z[i] 表示购买两件的折扣价。
  • dp[i][j] 表示前 i 种商品花费不超过 j 元所能获得的最大优惠金额。
  • 通过双重循环遍历商品和银行卡余额,使用状态转移方程更新 dp[i][j] 的值。
  • 最后输出 dp[M][N] 即为问题的答案。

这个问题是一个典型的动态规划问题,利用动态规划的思想,通过填表的方式计算出最优解。

在这个过程中,需要考虑当前商品购买一件和购买两件的情况,以及与之前的状态之间的关系。

算法的时间复杂度为 O(M * N),其中 M 为商品种类,N 为小明的银行卡余额。

C++

#include <algorithm>
#include <iostream>
#include <vector>using namespace std;int main()
{int M;   // 商品种类cin >> M;// 原价,购买一件的折扣价,购买两件的折扣价vector<int> X(M), Y(M), Z(M);for (int i = 0; i < M; ++i) {cin >> X[i] >> Y[i] >> Z[i];}int N;   // 银行卡余额cin >> N;// dp[i][j]表示前i个商品,花费不超过j元所能获得的最大优惠金额vector<vector<int>> dp(M + 1, vector<int>(N + 1, 0));for (int i = 1; i <= M; ++i) {for (int j = 1; j <= N; ++j) {// 不购买当前商品dp[i][j] = dp[i - 1][j];// 购买一件当前商品if (j >= Y[i - 1]) {int discount = X[i - 1] - Y[i - 1];   // 原价 - 优惠价 = 优惠金额dp[i][j]     = max(dp[i][j], dp[i - 1][j - Y[i - 1]] + discount);}// 购买两件当前商品if (j >= 2 * Z[i - 1]) {int discount = (X[i - 1] - Z[i - 1]) * 2;dp[i][j]     = max(dp[i][j], dp[i - 1][j - 2 * Z[i - 1]] + discount);}}}cout << dp[M][N] << endl;return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

这篇关于商城双11大促销 - 华为机试真题题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769769

相关文章

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。 给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为loca

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析