44题 小e的射击训练 | 豆包MarsCode AI刷题

115 阅读2分钟

小E的射击训练

问题描述

小E正在训练场进行射击练习,靶有10个环,靶心位于坐标(0, 0)。每个环对应不同的得分,靶心内(半径为1)得10分,依次向外的每个环分数减少1分。若射击点在某个半径为i的圆内,则得11-i分。如果射击点超出所有的环,则得0分。

根据给定的射击坐标(x, y),请计算小E的射击得分。

测试样例

样例1:

输入:x = 1, y = 0
输出:10

样例2:

输入:x = 1, y = 1
输出:9

样例3:

输入:x = 0, y = 5
输出:6

样例4:

输入:x = 3, y = 4
输出:6

问题理解

  1. 靶心和环的定义

    • 靶心位于坐标 (0, 0)
    • 靶心内(半径为1)得10分。
    • 依次向外的每个环分数减少1分。
    • 如果射击点超出所有的环,则得0分。
  2. 得分计算

    • 计算射击点 (x, y) 到靶心 (0, 0) 的距离。
    • 根据距离判断射击点所在的环,从而计算得分。

数据结构选择

  • 使用数学计算来确定射击点的位置和得分。

算法步骤

  1. 计算距离

    • 使用欧几里得距离公式计算射击点 (x, y) 到靶心 (0, 0) 的距离。
    • 公式为:distance = sqrt(x^2 + y^2)
  2. 确定环数

    • 根据距离判断射击点所在的环数。
    • 如果距离小于等于1,则在第1环(靶心),得10分。
    • 如果距离大于1且小于等于2,则在第2环,得9分,依此类推。
    • 如果距离大于10,则得0分。
  3. 计算得分

    • 根据环数计算得分,得分公式为 11 - 环数
import math
def solution(x: int, y: int) -> int:
    # write code here
    r = x*x + y * y
    r = math.sqrt(r)
    r = math.ceil(r)
    ans = 11-r
    # print(ans)
    if ans <= 0:
        return 0
    return ans

if __name__ == '__main__':
    print(solution(1, 0) == 10)
    print(solution(1, 1) == 9)
    print(solution(0, 5) == 6)
    print(solution(3, 4) == 6)

为什么使用math.ceil 而不是 math.floor

使用 math.ceil 而不是 math.floor 的原因在于题目中对环的定义和得分的计算方式。

  1. 环的定义

    • 题目中提到,如果射击点在某个半径为 i 的圆内,则得 11 - i 分。
    • 如果射击点在某个环的边界上,它应该被归类为该环,而不是外部的环。
  2. 距离计算

    • 使用欧几里得距离公式计算射击点 (x, y) 到靶心 (0, 0) 的距离:distance = sqrt(x^2 + y^2)
    • 这个距离是一个浮点数。
  3. 环数的确定

    • 如果使用 math.floor,它会向下取整,这意味着如果射击点在某个环的边界上,它会被归类为外部的环,这不符合题目的要求。
    • 如果使用 math.ceil,它会向上取整,这意味着如果射击点在某个环的边界上,它会被归类为该环,这符合题目的要求。