采购订单
2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型
华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解
题目描述
在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。
具体规则如下:
如果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 <= 10001 <= 商品价格 <= 2001 <= 商品数量 <= 10002 <= 商品编号 <= 1000
用例1
输入
2 1 200 90 0 2 30 101 0输出
1 200 81 2 30 101说明
商品1的原始单价为90,审批通过,生成一条PO,满足打折条件,打折后单价为81。
商品2的单价为101,审批通过,生成一条PO
用例2
输入
3 1 10 90 0 1 5 90 0 2 8 120 0输出
1 15 90 2 8 120说明
PR1和PR2均为商品1,单价90,审批通过,单价低于100元,合并数量为150.
PR3为商品2,单价120元,审批通过,单价高于100元,单独生成一条PO记录。
用例3
输入
4 1 5 80 0 2 3 120 0 3 2 90 1 4 10 150 2输出
1 5 80 2 3 120说明
PR1:商品1,单价80元,审批通过,单价低于100元,合并到PO中。PR2:商品2,单价120元,审批通过,单价高于100元,单独生成一条PO记录。PR3:审批拒绝, 忽略。PR4待审批忽略。
题解
思路
使用模拟进行处理:
- 循环处理输入的PR,两种策略处理审批通过不同单价产品:
- 单价> 100的PR: 直接生成一条最终PO记录。
- 单价 <= 100的PR:可以使用一个中间数组累计对应商品总数目
- 处理1中暂存数组中每个单价低于100的商品,为它们生成PO,如果该商品累计总数目大于等于100,折扣之后价格为
ceil(price * 0.9)向上取整,添加一条新的PO记录。 - 对于1 2 得到的最终PO记录,进行自定义排序.排序规则为
商品ID升序升序排列,相同商品按照数量降序排列 - 按顺序和题目要求规则输出PO记录。
code
#include <stdio.h> #include <math.h> #include <stdlib.h> #define MAXN 1000 typedef struct { int id; int num; int price; int discountPrice; } Product; typedef struct { int id; int num; int price; } LowProduct; /* 排序规则:id 升序,num 降序 */ int cmp(const void *a, const void *b) { Product *x = (Product *)a; Product *y = (Product *)b; if (x->id != y->id) return x->id - y->id; return y->num - x->num; } int main() { int n; scanf("%d", &n); Product res[MAXN]; int resCnt = 0; LowProduct low[MAXN]; int lowCnt = 0; for (int i = 0; i < n; i++) { int id, num, price, status; scanf("%d %d %d %d", &id, &num, &price, &status); if (status != 0) continue; if (price > 100) { // 高价商品,直接入结果 res[resCnt].id = id; res[resCnt].num = num; res[resCnt].price = price; res[resCnt].discountPrice = price; resCnt++; } else { // 低价商品,按 id 合并 int found = 0; for (int j = 0; j < lowCnt; j++) { if (low[j].id == id) { low[j].num += num; found = 1; break; } } if (!found) { low[lowCnt].id = id; low[lowCnt].num = num; low[lowCnt].price = price; lowCnt++; } } } // 处理低价商品合并结果 for (int i = 0; i < lowCnt; i++) { res[resCnt].id = low[i].id; res[resCnt].num = low[i].num; res[resCnt].price = low[i].price; if (low[i].num >= 100) { res[resCnt].discountPrice = (int)ceil(low[i].price * 0.9); } else { res[resCnt].discountPrice = low[i].price; } resCnt++; } // 排序 qsort(res, resCnt, sizeof(Product), cmp); // 输出 for (int i = 0; i < resCnt; i++) { printf("%d %d %d\n", res[i].id, res[i].num, res[i].discountPrice); } return 0; }