青训营题目:小E的射击训练+完美偶数计算题目解析

70 阅读4分钟

小E的射击训练

1.问题描述

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

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

2.解题思路

2.1问题分析

  • 输入:射击点的坐标 (x, y)
  • 输出:射击得分。
  • 目标:根据射击点与靶心的距离,确定得分。

2.2基本思路

  1. 计算距离:使用欧几里得距离公式计算射击点 (x, y) 到靶心 (0, 0) 的距离。
  2. 确定得分:根据距离确定得分。具体来说,如果距离在某个半径为 i 的圆内,则得 11 - i 分。如果距离大于10,则得0分。

2.3示例

  • 示例1:输入 x = 1, y = 0,输出 10
  • 示例2:输入 x = 1, y = 1,输出 9
  • 示例3:输入 x = 0, y = 5,输出 6
  • 示例4:输入 x = 3, y = 4,输出 6

2.4代码

from math import ceil
def solution(x: int, y: int) -> int:
    # write code here
    distance=(x*x+y*y)**0.5
    distance=ceil(distance)
    # print(distance)
    # print(ceil(distance))
    res=11-distance
    return  res if res>0 else 0
   

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

3.代码详解

计算距离

distance = (x ** 2 + y ** 2) ** 0.5 使用欧几里得距离公式计算射击点 (x, y) 到靶心 (0, 0) 的距离。

向上取整

distance=ceil(distance) 使用 math.ceil() 函数将距离向上取整

计算得分

  1. 使用 11 - rounded_distance 计算得分。
  2. 返回得分:如果得分大于0,则返回得分;否则返回0。

完美偶数计算

1.问题描述

小C定义了一个“完美偶数”。一个正整数 xx 被认为是完美偶数需要满足以下两个条件:

  1. xx 是偶数;
  2. xx 的值在区间 [l,r][l,r] 之间。

现在,小C有一个长度为 nn 的数组 aa,她想知道在这个数组中有多少个完美偶数。

2.解题思路

2.1问题分析

我们需要在一个数组中找出满足以下两个条件的元素数量:

  1. 该元素是偶数。
  2. 该元素在给定的区间 [l,r][l, r] 内。

2.2基本思路

  1. 遍历数组:遍历数组中的每一个元素。
  2. 检查条件:对于每一个元素,检查它是否是偶数,并且是否在区间 [l,r][l, r] 内。
  3. 计数:如果满足条件,则计数器加一。
  4. 返回结果:遍历结束后,返回计数器的值。

2.3示例

样例1:

输入:n = 5, l = 3, r = 8, a = [1, 2, 6, 8, 7] 输出:2

解释:

  • 数组中的偶数有:2, 6, 8
  • 在区间 [3,8][3, 8] 内的偶数有:6, 8
  • 因此,完美偶数的数量是 2。

样例2:

输入:n = 4, l = 10, r = 20, a = [12, 15, 18, 9] 输出:2

解释:

  • 数组中的偶数有:12, 18
  • 在区间 [10,20][10, 20] 内的偶数有:12, 18
  • 因此,完美偶数的数量是 2。

2.4代码

def solution(n: int, l: int, r: int, a: list) -> int:
    # 初始化计数器
    cnt = 0
    
    # 遍历数组中的每一个元素
    for x in a:
        # 检查元素是否是偶数,并且是否在区间 [l, r] 内
        if x % 2 == 0 and l <= x <= r:
            # 如果满足条件,计数器加一
            cnt += 1
    
    # 返回计数器的值
    return cnt

# 测试用例
if __name__ == '__main__':
    print(solution(5, 3, 8, [1, 2, 6, 8, 7]) == 2)
    print(solution(4, 10, 20, [12, 15, 18, 9]) == 2)
    print(solution(3, 1, 10, [2, 4, 6]) == 3)

3.代码详解

  1. 函数定义solution(n: int, l: int, r: int, a: list) -> int

    • n:数组的长度。
    • l:区间的下界。
    • r:区间的上界。
    • a:输入的数组。
  2. 初始化计数器cnt = 0

    • 用于记录满足条件的元素数量。
  3. 遍历数组for x in a:

    • 对数组中的每一个元素进行检查。
  4. 检查条件if x % 2 == 0 and l <= x <= r:

    • x % 2 == 0:检查元素是否是偶数。
    • l <= x <= r:检查元素是否在区间 [l,r][l, r] 内。
  5. 计数器加一cnt += 1

    • 如果元素满足条件,计数器加一。
  6. 返回结果return cnt

    • 返回满足条件的元素数量。

至此,小E的射击训练+完美偶数计算题目解析完结撒花!