PAT乙级 C语言 1018 解题思路及代码实现
时间: 2025-04-28 20:25:06 浏览: 38
### PAT乙级C语言题目1018解题思路
对于PAT乙级中的题目1018,该题主要考察字符串处理能力。具体来说,程序需要接收一系列学号并按照特定规则进行排序和查找。
#### 输入输出说明
输入首先提供一个正整数N表示参赛人数,接着有N行数据代表每位选手的ID(四位数字)。之后再给定另一个正整数K以及紧接着的K个待查ID列表。最后的任务是对这K个ID依次判断其是否存在,并返回相应的名次或者提示不存在[^2]。
#### 主要逻辑分析
为了高效完成此任务,可以采用哈希表来存储所有参与比赛的学生信息及其对应的排名位置。当遇到查询请求时,通过O(1)时间复杂度快速定位到目标学生的位置从而得出答案。如果找不到,则表明该生未参加此次竞赛。
以下是具体的算法流程:
- 初始化一个大小为`10000`的数组用于模拟哈希表;
- 对于每一个读入的学生编号,在对应下标的数组元素处记录当前学生的实际序号加一(因为可能存在重复号码的情况);
- 接受询问阶段,针对每个被问及的学生编号,检查预设好的哈希表中相应索引是否有值存在——若有则输出其值减去一作为真实排名;反之打印`-1`表示不在名单之内。
#### 完整代码实现
下面给出了完整的解决方案,包括必要的头文件引入、变量声明部分以及核心业务逻辑编码:
```c
#include <stdio.h>
int main(){
int n,k,id,i;
static unsigned short rank[10000]={}; // 声明静态局部数组以节省栈空间
scanf("%d",&n);
for(i=0;i<n;++i){
scanf("%d",&id);
rank[id]=i+1; // 记录各成员的具体排行情况
}
scanf("%d",&k);
while(k--){
scanf("%d",&id);
if(rank[id])printf("%u\n",rank[id]-1);
else puts("-1");
}
return 0;
}
```
阅读全文
相关推荐


















