AI 刷题 44. 小E的射击训练 题解 | 豆包MarsCode AI刷题

72 阅读2分钟

image.png

问题分析

小E进行射击练习的靶子有10个环,靶心位于坐标原点(0, 0)。射击点在不同的环内会获得不同的分数,具体如下:

  • 半径为 1 的圆(靶心):得 10 分
  • 半径为 2 的圆:得 9 分
  • 半径为 3 的圆:得 8 分
  • ...
  • 半径为 10 的圆:得 1 分
  • 如果射击点超出了所有的环(即超出了半径为 10 的圆),得 0 分

问题转化

给定射击点的坐标 (x, y),我们需要根据该点与原点之间的距离来判断该点所在的环,并计算得分。射击点的得分是根据距离原点的距离来决定的。

具体而言:

  • 计算点 (x, y) 到原点 (0, 0) 的欧几里得距离:distance = sqrt(x^2 + y^2)

  • 根据 distance 的值确定其所处的环:

    • 如果 distance 小于等于 1,则得 10 分;
    • 如果 distance 小于等于 2,则得 9 分;
    • 如果 distance 小于等于 3,则得 8 分;
    • 以此类推,直到 distance 小于等于 10 得 1 分;
    • 如果 distance 大于 10,则得 0 分。

思路与步骤

  1. 计算距离: 使用公式 distance = sqrt(x^2 + y^2) 计算射击点 (x, y) 到原点的距离。

  2. 判断得分:

    • 通过对 distance 的大小进行判断,确定射击点所处的环。
    • 可以通过逐层比较 distance 是否小于或等于对应的半径值来确定得分。
  3. 优化: 由于在计算距离时,平方根并不影响最终的比较,因此我们可以避免使用 sqrt,直接使用 distance^2 进行比较。这样我们只需计算 x^2 + y^2,提高效率。

示例

示例 1:

输入:

Copy Code
3 4

计算:

  • distance_squared = 3^2 + 4^2 = 9 + 16 = 25
  • 由于 25 <= 36,因此得分为 5 分。

输出:

Copy Code
5

示例 2:

输入:

Copy Code
6 8

计算:

  • distance_squared = 6^2 + 8^2 = 36 + 64 = 100
  • 由于 100 <= 100,因此得分为 1 分。

输出:

Copy Code
1

示例 3:

输入:

Copy Code
0 0

计算:

  • distance_squared = 0^2 + 0^2 = 0
  • 由于 0 <= 1,因此得分为 10 分。

输出:

Copy Code
10

时间复杂度与空间复杂度

  • 时间复杂度:  O(1)。因为无论输入的坐标是什么,我们只需要进行常数次的计算和判断。
  • 空间复杂度:  O(1)。我们只需要常量空间来存储输入值和计算结果。

总结

通过计算射击点 (x, y) 到原点的距离的平方并根据其大小判断得分,我们可以高效地解决这个问题。此方法避免了使用浮点数计算,提高了程序的效率,并且通过简单的条件判断直接得出结果。

image.png

image.png