小E的射击训练(青训营X豆包MarsCode) | 豆包MarsCode AI 刷题

114 阅读3分钟

小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),每个环的分数取决于射击点到靶心的距离。具体来说:

  1. 如果射击点 (x, y) 在靶心内(即距离小于等于1),得10分。
  2. 如果射击点在第二个环内(即距离大于1且小于等于2),得9分。
  3. 如果射击点在第三个环内(即距离大于2且小于等于3),得8分。
  4. 以此类推,直到距离大于10时,得分为0。

解决步骤:

  1. 计算射击点到靶心的距离:使用欧几里得距离公式:
    distance = sqrt(x2 + y2)
  2. 判断得分
    • 如果距离在某个环的半径范围内,就对应一个分数。
    • 如果距离大于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

解释:

  1. 距离计算:首先计算射击点 (x, y) 距离靶心的距离 distance,通过 math.sqrt(x^2 + y^2) 完成。
  2. 分数判断:根据计算出的距离,逐步判断在哪个环内。每个环的范围是从当前环的半径到下一个环的半径。例如,第一个环的半径为1,第二个环的半径为2,以此类推。

测试用例:

  1. 测试用例 1
    输入:x = 1, y = 0
    • 计算得到 distance = 1,对应第一个环,得分为10。
    • 输出:10
  1. 测试用例 2
    输入:x = 1, y = 1
    • 计算得到 distance = √(1^2 + 1^2) = √2 ≈ 1.414,属于第二个环,得分为9。
    • 输出:9
  1. 测试用例 3
    输入:x = 0, y = 5
    • 计算得到 distance = √(0^2 + 5^2) = 5,属于第五个环,得分为6。
    • 输出:6
  1. 测试用例 4
    输入:x = 3, y = 4
    • 计算得到 distance = √(3^2 + 4^2) = 5,属于第五个环,得分为6。
    • 输出:6

复杂度分析:

  • 计算距离的时间复杂度是 ( O(1) ),因为它只涉及常数次的加法、平方和开方操作。
  • 判断得分的时间复杂度也是 ( O(1) ),因为只有固定的分支条件。

所以,整体时间复杂度为 ( O(1) )。