小U的奖学金申请问题 | 豆包MarsCode AI刷题

111 阅读4分钟

小U的奖学金申请问题

问题描述

小U是一位努力的学生,她正在申请奖学金。她修了nn门课程,每门课程有一个对应的学分aia_i,并取得了一个成绩bib_i。学校的奖学金评定要求是:小U所有课程的加权平均分不低于标准XX,并且所有课程的成绩都及格(即每门课的成绩不得低于6060分)。小U想知道她是否满足奖学金的申请条件。


测试样例

样例1:

输入:n = 4, x = 75, a = [4, 3, 2, 1], b = [80, 70, 90, 60]
输出:True

样例2:

输入:n = 3, x = 85, a = [3, 2, 5], b = [90, 85, 88]
输出:True

样例3:

输入:n = 5, x = 80, a = [2, 2, 3, 1, 4], b = [78, 80, 79, 85, 88]
输出:True

样例4:

输入:n = 6, x = 70, a = [4, 3, 2, 1, 2, 3], b = [60, 72, 65, 90, 85, 95]
输出:True

样例5:

输入:n = 4, x = 90, a = [2, 2, 2, 2], b = [89, 91, 92, 85]
输出:False

问题解析

小U正在申请奖学金,她需要满足两个条件:

  1. 所有课程的加权平均分不低于标准X

    • 加权平均分是通过将每门课程的学分(a列表中的值)与对应的成绩(b列表中的值)相乘,然后将这些乘积相加得到总分。
    • 接着,将总分除以总学分(a列表中所有值的和)来得到加权平均分。
  2. 所有课程的成绩都及格(即每门课的成绩不得低于60分)

    • 这意味着我们需要检查b列表中的每个值是否都大于或等于60。

为了解决这个问题,我们需要计算小U所有课程的加权平均分,并检查是否每门课程的成绩都不低于60分。加权平均分是通过将每门课程的学分与成绩相乘,然后将这些乘积相加,最后除以总学分来计算的。

代码解析

下面是solution函数的详细解析:

我们首先遍历成绩列表 b,检查是否有任何成绩低于60分。如果有,我们立即返回 False。然后,我们使用列表推导式和 zip 函数来计算加权总分和总学分。最后,我们计算加权平均分,并将其与标准 x 进行比较,以确定是否满足奖学金的申请条件。

def solution(n: int, x: int, a: list, b: list) -> bool:
    # 首先,我们检查所有课程的成绩是否都及格
    # 使用for循环遍历b列表中的每个成绩
    for score in b:
        # 如果发现任何成绩低于60分,立即返回False
        if score < 60:
            return False
    
    # 如果所有成绩都及格,我们继续计算加权平均分
    # 使用列表推导式和zip函数来计算加权总分
    # zip(a, b)会将a和b列表中的元素一一对应起来,形成一个元组的列表
    # ai * bi计算每门课程的加权分数,sum()函数将这些加权分数相加得到总分
    total_weighted_score = sum(ai * bi for ai, bi in zip(a, b))
    
    # 计算总学分,即a列表中所有元素的和
    total_credits = sum(a)
    
    # 计算加权平均分,即总分除以总学分
    weighted_average = total_weighted_score / total_credits
    
    # 最后,我们检查加权平均分是否不低于标准X
    # 如果不低于,返回True;否则,返回False
    return weighted_average >= x

测试样例解析

现在,让我们逐一解析测试样例:

  1. 样例1

    • 输入:n = 4, x = 75, a = [4, 3, 2, 1], b = [80, 70, 90, 60]
    • 解析:所有成绩都及格,加权平均分 = (4*80 + 3*70 + 2*90 + 1*60) / (4 + 3 + 2 + 1) = 76,不低于75,所以输出True
  2. 样例2

    • 输入:n = 3, x = 85, a = [3, 2, 5], b = [90, 85, 88]
    • 解析:所有成绩都及格,加权平均分 = (3*90 + 2*85 + 5*88) / (3 + 2 + 5) = 86.5,不低于85,所以输出True
  3. 样例3

    • 输入:n = 5, x = 80, a = [2, 2, 3, 1, 4], b = [78, 80, 79, 85, 88]
    • 解析:所有成绩都及格,加权平均分 = (2*78 + 2*80 + 3*79 + 1*85 + 4*88) / (2 + 2 + 3 + 1 + 4) = 81.625,不低于80,所以输出True
  4. 样例4

    • 输入:n = 6, x = 70, a = [4, 3, 2, 1, 2, 3], b = [60, 72, 65, 90, 85, 95]
    • 解析:所有成绩都及格(尽管有一门是60分,但也算及格),加权平均分 = (4*60 + 3*72 + 2*65 + 1*90 + 2*85 + 3*95) / (4 + 3 + 2 + 1 + 2 + 3) = 76.875,不低于70,所以输出True
  5. 样例5

    • 输入:n = 4, x = 90, a = [2, 2, 2, 2], b = [89, 91, 92, 85]
    • 解析:所有成绩都及格,但加权平均分 = (2*89 + 2*91 + 2*92 + 2*85) / (2 + 2 + 2 + 2) = 89.25,低于90,所以输出False

#青训营笔记创作活动