「PAT乙级真题解析」Basic Level 1082 射击比赛 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定一组坐标以及对应的ID,要求计算哪个坐标离远点最近和最远,这是一道最值计算问题。 与原点的距离等于两个坐标值分别平方相加后的正平方根。即, distance = sqrt(x^2 + y^2)

#pat考试#c语言#算法#需求分析#数据结构

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1082 射击比赛

问题分析

题设给定一组坐标以及对应的ID,要求计算哪个坐标离远点最近和最远,这是一道最值计算问题。 与原点的距离等于两个坐标值分别平方相加后的正平方根。即, distance = sqrt(x^2 + y^2)

完整步骤描述

  1. 获取输入: 选手人数(坐标组数)
  2. 初始化记录器:
    • 最近的距离 = 300
    • 最近距离的ID
    • 最远的距离 = -1
    • 最远距离的ID
  3. 对于每一组坐标:
    • 计算坐标离远点距离
    • 如果距离小于当前最近距离:
      • 当前最近距离 = 当前计算得到的距离
      • 最近距离的ID = 当前ID
    • 如果距离大于当前最远距离:
      • 当前最远距离 = 当前计算得到的距离
      • 最远距离的ID = 当前ID
  4. 输出最近距离的ID和最远距离的ID

伪代码描述

  1. get input: player_amount
  2. init recorder:
    • max_distance = -1
    • best_player_ID
    • min_distance = 300
    • worst_player_ID
  3. for each player:
    • get input: ID, x, y
    • calculate distance = sqrt(x * x + y * y);
    • if distance < min_distance:
      • min_distance = distance;
      • best_player_ID = ID;
    • if distance > max_distance:
      • max_distance = distance;
      • worst_player_ID = ID
  4. print(best_player_ID, worst_player_ID);

完整提交代码

/*
# 问题分析
题设给定一组坐标以及对应的ID,要求计算哪个坐标离远点最近和最远,这是一道最值计算问题。
与原点的距离等于两个坐标值分别平方相加后的正平方根。即, distance = sqrt(x^2 + y^2)
 
# 完整步骤描述
1. 获取输入: 选手人数(坐标组数)
2. 初始化记录器:
    - 最近的距离 = 300
    - 最近距离的ID
    - 最远的距离 = -1
    - 最远距离的ID
3. 对于每一组坐标:
    - 计算坐标离远点距离
    - 如果距离小于当前最近距离:
        - 当前最近距离 = 当前计算得到的距离
        - 最近距离的ID = 当前ID
    - 如果距离大于当前最远距离:
        - 当前最远距离 = 当前计算得到的距离
        - 最远距离的ID = 当前ID
4. 输出最近距离的ID和最远距离的ID
 
# 伪代码描述
1. get input: player_amount
2. init recorder:
    - max_distance = -1
    - best_player_ID
    - min_distance = 300
    - worst_player_ID
3. for each player:
    - get input: ID, x, y
    - calculate distance = sqrt(x * x + y * y);
    - if distance < min_distance:
        - min_distance = distance;
        - best_player_ID = ID;
    - if distance > max_distance:
        - max_distance = distance;
        - worst_player_ID = ID
4. print(best_player_ID, worst_player_ID);
*/
 
 
# include<stdio.h>
# include<math.h>
 
int main(){
    int player_amount;
    scanf("%d", &player_amount);
    double min_distance = 300;
    double max_distance = -1;
    int best_player_ID, worst_player_ID;
    
    int player_ID, x, y;
    for (int i = 0; i < player_amount; i++){
        scanf("%d %d %d", &player_ID, &x, &y);
        double distance = sqrt(x * x + y * y);
        if (distance < min_distance){
            min_distance = distance;
            best_player_ID = player_ID;
        }
        if (distance > max_distance){
            max_distance = distance;
            worst_player_ID = player_ID;
        }
    }
    
    printf("%04d %04d", best_player_ID, worst_player_ID);
    return 0;
}
「PAT乙级真题解析」Basic Level 1082 射击比赛 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果