小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
问题理解
-
靶心和环的定义:
- 靶心位于坐标
(0, 0)。 - 靶心内(半径为1)得10分。
- 依次向外的每个环分数减少1分。
- 如果射击点超出所有的环,则得0分。
- 靶心位于坐标
-
得分计算:
- 计算射击点
(x, y)到靶心(0, 0)的距离。 - 根据距离判断射击点所在的环,从而计算得分。
- 计算射击点
数据结构选择
- 使用数学计算来确定射击点的位置和得分。
算法步骤
-
计算距离:
- 使用欧几里得距离公式计算射击点
(x, y)到靶心(0, 0)的距离。 - 公式为:
distance = sqrt(x^2 + y^2)。
- 使用欧几里得距离公式计算射击点
-
确定环数:
- 根据距离判断射击点所在的环数。
- 如果距离小于等于1,则在第1环(靶心),得10分。
- 如果距离大于1且小于等于2,则在第2环,得9分,依此类推。
- 如果距离大于10,则得0分。
-
计算得分:
- 根据环数计算得分,得分公式为
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 的原因在于题目中对环的定义和得分的计算方式。
-
环的定义:
- 题目中提到,如果射击点在某个半径为
i的圆内,则得11 - i分。 - 如果射击点在某个环的边界上,它应该被归类为该环,而不是外部的环。
- 题目中提到,如果射击点在某个半径为
-
距离计算:
- 使用欧几里得距离公式计算射击点
(x, y)到靶心(0, 0)的距离:distance = sqrt(x^2 + y^2)。 - 这个距离是一个浮点数。
- 使用欧几里得距离公式计算射击点
-
环数的确定:
- 如果使用
math.floor,它会向下取整,这意味着如果射击点在某个环的边界上,它会被归类为外部的环,这不符合题目的要求。 - 如果使用
math.ceil,它会向上取整,这意味着如果射击点在某个环的边界上,它会被归类为该环,这符合题目的要求。
- 如果使用