1. PAT乙级1072题解:学生违禁物品检查系统实现
这道PAT乙级1072题考察的是基础的数组应用和输入输出处理能力,题目要求我们实现一个学生违禁物品检查系统。作为一名参加过多次PAT考试的选手,我发现这道题虽然看起来简单,但在实际编码时还是有几个容易踩坑的地方。
1.1 题目需求分析
题目大意是:给定一批违禁物品编号,然后检查每个学生携带的物品中是否包含这些违禁品。需要输出携带违禁品的学生名单及其违禁物品编号,最后统计违规学生人数和违禁物品总数。
核心需求可以分解为:
- 存储违禁物品编号(高效查找)
- 处理每个学生的物品清单(输入格式解析)
- 判断物品是否违禁(快速查询)
- 按要求格式输出结果(输出格式控制)
1.2 解题思路设计
我采用的解决方案是:
- 使用一个大小为10000的int数组v作为标记数组(因为物品编号是4位数字)
- 先将所有违禁物品编号在v数组中标记为1
- 然后逐个学生检查,发现违禁物品时按格式输出
- 最后输出统计结果
这种方案的优势是:
- 查询时间复杂度O(1),非常高效
- 实现简单,代码量少
- 内存消耗固定(10000*4字节)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
2.1 头文件与变量定义
cpp复制#include<bits/stdc++.h>
using namespace std;
int main() {
int n,m;
int num0;
cin >> n >> m;
int v[10000] = {0};
这里使用了万能头文件bits/stdc++.h,在竞赛中很常见但实际工程中不推荐。定义了两个整数n和m分别表示学生人数和违禁物品数量。数组v用于标记违禁物品。
注意:在实际项目中,建议使用具体的头文件而不是万能头文件,以避免不必要的编译时间和命名冲突。
2.2 读取并标记违禁物品
cpp复制for(int i = 0; i < m; i ++) {
scanf("%4d", &num0);
v[num0] = 1;
}
这里使用scanf("%4d")来确保读取4位数字,即使编号以0开头也能正确读取。这是处理固定位数编号的常用技巧。
