「PAT乙级真题解析」Basic Level 1102 教超冠军卷 (问题分析+完整步骤+伪代码描述+提交通过代码)
题设给定一组销量和单价, 要求计算出销量最高的商品以及销售总额最高的商品。 因为本题要求计算最值, 所以显然是一道最值题, 需要做的就是数据存储与比较(/统计)。 因为只求最值, 给出的ID唯一(即不存在商品数据合并的操作), 所以只需要储存目前的最值, 然后每次新数据进来进行比较即可, 比当前最值小的数据不需要存储。
#算法#需求分析#c语言#数据结构#pat考试
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT (Basic Level) Practice 1102 教超冠军卷
问题分析
- 题设给定一组销量和单价, 要求计算出销量最高的商品以及销售总额最高的商品。
- 因为本题要求计算最值, 所以显然是一道最值题, 需要做的就是数据存储与比较(/统计)。
- 因为只求最值, 给出的ID唯一(即不存在商品数据合并的操作), 所以只需要储存目前的最值, 然后每次新数据进来进行比较即可, 比当前最值小的数据不需要存储。
完整描述步骤
- 获取输入: 商品数目
- 初始化统计器:
- 当前最大销量 = 0
- 当前最大销量对应的商品ID
- 当前最大销售额 = 0
- 当前最大销售额对应的商品ID
- 获取输入: 每一样商品
- 对于每一样商品数据:
- 如果 该商品的销量 大于 当前最大销量:
- 当前最大销量 = 该商品销量
- 当前最大销量对应的商品ID = 商品ID
- 如果 该商品的销量与单价的乘积 大于 当前最大销售额:
- 当前最大销售额 = 该商品销量 * 该商品单价
- 当前最大销售额对应的商品ID = 商品ID
- 如果 该商品的销量 大于 当前最大销量:
- 输出:
- 当前最大销量对应的商品ID, 当前最大销量
- 当前最大销售额对应的商品ID, 当前最大销售额
伪代码描述
- get input: case_amount
- init recorder:
- max_quantity = 0;
- max_quantity_idx = ""
- max_sale = 0;
- max_sale_idx = "";
- for each case:
- get input: ID, quantity, price
- if quantity > max_quantity:
- max_quantity = quantity;
- max_quantity_idx = ID;
- if quantity * price > max_sale:
- max_sale = quantity * price;
- max_sale_idx = ID;
- print(max_quantity_idx, max_quantity)
- print(max_sale_idx, max_sale)
注意事项
- 由于ID的读取是每次都要读取的, 如果直接存储冠军的ID, 则要进行多次string copy
- 直接使用字符串数组存储读取的每一个ID, 然后存储冠军ID的索引, 可以减少不必要的string copy
完整提交代码
/*
# 问题分析
题设给定一组销量和单价, 要求计算出销量最高的商品以及销售总额最高的商品。
因为本题要求计算最值, 所以显然是一道最值题, 需要做的就是数据存储与比较(/统计)。
因为只求最值, 给出的ID唯一(即不存在商品数据合并的操作), 所以只需要储存目前的最值, 然后每次新数据进来进行比较即可, 比当前最值小的数据不需要存储。
# 完整描述步骤
1. 获取输入: 商品数目
2. 初始化统计器:
- 当前最大销量 = 0
- 当前最大销量对应的商品ID
- 当前最大销售额 = 0
- 当前最大销售额对应的商品ID
3. 获取输入: 每一样商品
4. 对于每一样商品数据:
- 如果 该商品的销量 大于 当前最大销量:
- 当前最大销量 = 该商品销量
- 当前最大销量对应的商品ID = 商品ID
- 如果 该商品的销量与单价的乘积 大于 当前最大销售额:
- 当前最大销售额 = 该商品销量 * 该商品单价
- 当前最大销售额对应的商品ID = 商品ID
5. 输出:
- 当前最大销量对应的商品ID, 当前最大销量
- 当前最大销售额对应的商品ID, 当前最大销售额
# 伪代码描述
1. get input: case_amount
2. init recorder:
- max_quantity = 0;
- max_quantity_idx = ""
- max_sale = 0;
- max_sale_idx = "";
3. for each case:
- get input: ID, quantity, price
- if quantity > max_quantity:
- max_quantity = quantity;
- max_quantity_idx = ID;
- if quantity * price > max_sale:
- max_sale = quantity * price;
- max_sale_idx = ID;
4. print(max_quantity_idx, max_quantity)
5. print(max_sale_idx, max_sale)
# 注意事项
1. 由于ID的读取是每次都要读取的, 如果直接存储冠军的ID, 则要进行多次string copy
- 直接使用字符串数组存储读取的每一个ID, 然后存储冠军ID的索引, 可以减少不必要的string copy
*/
# include<stdio.h>
int main(){
int case_amount;
scanf("%d\n", &case_amount);
int max_quantity_idx = -1;
int max_quantity = -1;
int max_sale_idx = -1;
int max_sale = -1;
char ID[case_amount][9];
int price;
int quantity;
for(int i = 0; i < case_amount; i++){
scanf("%s %d %d\n", ID[i], &price, &quantity);
if (quantity > max_quantity){
max_quantity = quantity;
max_quantity_idx = i;
}
if (quantity * price > max_sale){
max_sale = quantity * price;
max_sale_idx = i;
}
}
printf("%s %d\n", ID[max_quantity_idx], max_quantity);
printf("%s %d\n", ID[max_sale_idx], max_sale);
}