小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
为了计算小E的射击得分,首先要确定射击点 (x, y) 距离靶心的距离。根据题意,靶心位于坐标 (0, 0),每个环的分数取决于射击点到靶心的距离。具体来说:
- 如果射击点
(x, y)在靶心内(即距离小于等于1),得10分。 - 如果射击点在第二个环内(即距离大于1且小于等于2),得9分。
- 如果射击点在第三个环内(即距离大于2且小于等于3),得8分。
- 以此类推,直到距离大于10时,得分为0。
解决步骤:
- 计算射击点到靶心的距离:使用欧几里得距离公式:
distance = sqrt(x2 + y2) - 判断得分:
-
- 如果距离在某个环的半径范围内,就对应一个分数。
- 如果距离大于10,则得分为0。
代码实现:
import math
def score(x, y):
# 计算射击点到靶心的距离
distance = math.sqrt(x**2 + y**2)
# 根据距离判断得分
if distance <= 1:
return 10
elif distance <= 2:
return 9
elif distance <= 3:
return 8
elif distance <= 4:
return 7
elif distance <= 5:
return 6
elif distance <= 6:
return 5
elif distance <= 7:
return 4
elif distance <= 8:
return 3
elif distance <= 9:
return 2
elif distance <= 10:
return 1
else:
return 0
# 测试用例
print(score(1, 0)) # 输出:10
print(score(1, 1)) # 输出:9
print(score(0, 5)) # 输出:6
print(score(3, 4)) # 输出:6
解释:
- 距离计算:首先计算射击点
(x, y)距离靶心的距离distance,通过math.sqrt(x^2 + y^2)完成。 - 分数判断:根据计算出的距离,逐步判断在哪个环内。每个环的范围是从当前环的半径到下一个环的半径。例如,第一个环的半径为1,第二个环的半径为2,以此类推。
测试用例:
- 测试用例 1:
输入:x = 1, y = 0
-
- 计算得到
distance = 1,对应第一个环,得分为10。 - 输出:
10
- 计算得到
- 测试用例 2:
输入:x = 1, y = 1
-
- 计算得到
distance = √(1^2 + 1^2) = √2 ≈ 1.414,属于第二个环,得分为9。 - 输出:
9
- 计算得到
- 测试用例 3:
输入:x = 0, y = 5
-
- 计算得到
distance = √(0^2 + 5^2) = 5,属于第五个环,得分为6。 - 输出:
6
- 计算得到
- 测试用例 4:
输入:x = 3, y = 4
-
- 计算得到
distance = √(3^2 + 4^2) = 5,属于第五个环,得分为6。 - 输出:
6
- 计算得到
复杂度分析:
- 计算距离的时间复杂度是 ( O(1) ),因为它只涉及常数次的加法、平方和开方操作。
- 判断得分的时间复杂度也是 ( O(1) ),因为只有固定的分支条件。
所以,整体时间复杂度为 ( O(1) )。