[PAT乙级]1082 射击比赛 (思路+精简代码)

1082 射击比赛

本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。

输入格式:
输入在第一行中给出一个正整数 N(N ≤ 10 000)。随后 N 行,每行按下列格式给出:
ID x y
其中 ID 是运动员的编号(由 4 位数字组成);x 和 y 是其打出的弹洞的平面坐标(x,y),均为整数,且 0 ≤ |x|, |y| ≤ 100。题目保证每个运动员的编号不重复,且每人只打 1 枪。

输出格式:
输出冠军和菜鸟的编号,中间空 1 格。题目保证他们是唯一的。

输入样例:

3
0001 5 7
1020 -1 3
0233 0 -1

输出样例:

0233 0001

思路:水题。不要排序,不要建立结构体,直接计算出每位选手的距离靶心的距离,与当前最大值最小值比较,若大于最大值,则成为新的菜鸟,若小于最小值,则成为新的冠军。最后直接输出菜鸟和冠军的编号

#
### 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; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoobDream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值