题目描述
在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个 PR 包含商品的单价及数量信息。系统要求对商品进行分类处理:
- 高价商品:单价高于 100 元的商品需要单独处理,不与其他记录合并。
- 低价商品:单价低于或等于 100 元的相同商品可以合并到同一采购订单 PO 中。如果合并后的总量较大,可以享受折扣。
具体规则如下:
- 若 PR 状态为'审批通过',则将其商品加入到 PO 计算中。
- 若 PR 状态为'审批拒绝'或'待审批',则忽略该 PR。
- 对于单价高于 100 元的商品,每个商品单独生成一条 PO 记录。
- 对于单价低于或等于 100 元的商品,将相同商品的数量合并到一条 PO 记录中。
- 如果商品单价 < 100 且商品数量 >= 100,则单价打 9 折(向上取整)。
输入描述
第一行包含整数 N,表示 PR 的数量。 接下来 N 行,每行包含四个用空格分割的整数,按顺序表示:商品 ID、数量、单价、PR 状态(0 表示审批通过,1 表示审批拒绝,2 表示待审批)。
输出描述
输出若干行,每行表示一条 PO 记录,格式如下:
- 对于单价高于 100 元的商品:商品 ID 数量 单价
- 对于单价低于或等于 100 元的商品:商品 ID 总数量 打折后的单价(向上取整)
输出的 PO 记录按商品 ID 升序排列,相同商品按照数量降序排列。
约束条件
- 2 <= n <= 1000
- 1 <= 商品价格 <= 200
- 1 <= 商品数量 <= 1000
- 2 <= 商品编号 <= 100
解题思路
这道题的核心在于数据的过滤、聚合与排序。我们需要先根据状态筛选有效数据,再根据价格策略决定是独立记录还是合并记录,最后应用折扣并排序输出。
- 数据清洗:遍历输入,只保留状态为 0(审批通过)的记录。
- 分类处理:
- 单价 > 100:直接加入结果列表,不进行合并。
- 单价 <= 100:使用哈希表(字典)按商品 ID 聚合数量和单价。注意这里单价是一样的,但数量需要累加。
- 折扣计算:在聚合完成后,检查低价商品的总数量。如果 >= 100,单价乘以 0.9 并向上取整。
- 排序输出:结果列表需按商品 ID 升序为主键,数量降序为次键进行排序。
代码实现
下面分别提供 Python 和 JavaScript 的实现方案。两种语言逻辑一致,主要区别在于数据结构的使用。
Python 实现
Python 中使用 dict 来存储低价商品的聚合数据,利用 math.ceil 处理向上取整。
import sys
import math
def solve():
# 读取所有输入行
input_data = sys.stdin.read().split()
if not input_data:
return
iterator = iter(input_data)
try:
n = int((iterator))
StopIteration:
high_price_items = []
low_price_map = {}
_ (n):
:
item_id = ((iterator))
qty = ((iterator))
price = ((iterator))
status = ((iterator))
StopIteration:
status != :
price > :
high_price_items.append({
: item_id,
: qty,
: price
})
:
item_id low_price_map:
low_price_map[item_id] = {: , : price}
low_price_map[item_id][] += qty
result = []
item high_price_items:
result.append(item)
item_id, data low_price_map.items():
final_price = data[]
total_qty = data[]
total_qty >= :
final_price = math.ceil(final_price * )
result.append({
: item_id,
: total_qty,
: final_price
})
result.sort(key= x: (x[], -x[]))
item result:
()
__name__ == :
solve()


