1. 采购订单系统设计与实现解析
最近在准备华为OD机试双机位C卷的同学们,应该都注意到了采购订单这道100分题型。作为一个经历过多次机考的老手,我想分享一下这道题的完整解题思路和C语言实现方案。这道题考察的是对采购系统业务逻辑的理解和数据结构应用能力,非常具有代表性。
采购订单系统的核心逻辑其实并不复杂:我们需要处理一批采购申请(PR),根据商品单价和审批状态生成对应的采购订单(PO)。关键在于如何高效地分类处理不同价格的商品,并实现合并与打折逻辑。下面我将从需求分析、数据结构选择、算法设计和代码实现四个维度,带大家彻底吃透这道题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 需求分析与规则拆解
2.1 输入输出规范
首先明确题目给出的输入格式:
- 第一行是整数N,表示PR的数量
- 接下来N行,每行包含5个用空格分隔的整数:商品ID、数量、单价、PR状态(0=通过,1=拒绝,2=待审批)
输出应该是生成的PO记录,每条记录包含商品ID、总数量、实际单价(考虑折扣后)。根据题目要求,我们需要按以下规则处理:
2.2 核心业务规则
-
审批状态过滤:
- 只处理状态为0(审批通过)的PR
- 状态为1或2的直接忽略
-
高价商品处理:
- 单价>100的商品,每个PR生成一条独立PO
- 即使同一商品ID的多条PR也不合并
-
低价商品处理:
- 单价≤100的商品,相同商品ID的PR需要合并为一条PO
- 合并后的总数量≥100时,单价打9折
注意:打折是基于原始单价计算,不是累进折扣。例如两笔50件的订单合并为100件,单价从80降为72(80×0.9)
2.3 边界条件考虑
在实际编码前,我们需要考虑几个特殊场景:
- 同一商品ID可能同时存在高价和低价PR(虽然题目说同商品单价相同,但代码应有健壮性)
- 合并后的数量可能超过INT_MAX(虽然机考通常不测这个)
- 输入数据中可能有无效值(负数或超大数)
3. 数据结构设计与算法选择
3.1 数据结构选型
针对这个问题,最合适的数据结构是哈希表(或称为字典):
- 键(Key):商品ID
- 值(Value):结构体包含总数量和单价
在C语言中,我们可以用两种方式实现哈希表:
- **数
