题目链接
题目描述
牛牛的期中考试有三门科目,考核标准是三科平均分不低于 60 分。如果平均分低于 60 分,班主任就会请家长。给定牛牛的三科成绩,请判断他是否会被请家长。
输入描述: 在一行中输入三个整数,分别表示牛牛的三科成绩。
输出描述: 如果牛牛会被请家长(即平均分低于60),输出 "YES";否则输出 "NO"。
解题思路
本题的核心是判断三科成绩的平均分是否小于 60。
方法一:浮点数计算(不推荐) 最直观的方法是先计算三科总分,然后除以 3.0 得到一个浮点数平均分,再与 60 进行比较。这种方法是可行的,但在处理浮点数时需要注意潜在的精度问题,虽然在本题中影响不大,但在更复杂的场景下可能会成为陷阱。
方法二:整数计算(推荐)
一个更健壮、更高效的技巧是避免浮点数运算。我们可以将判断条件 (a + b + c) / 3 < 60
进行数学变换。
在不等式两边同时乘以 3,得到一个完全等价的、只涉及整数运算的条件:
a + b + c < 180
这种方法不仅计算更快,而且完全避免了浮点数可能带来的精度误差,是解决此类问题的首选策略。
- 读取输入:读取三个整数成绩
a
,b
,c
。 - 计算总分:计算
sum = a + b + c
。 - 判断:检查
sum
是否小于 180。 - 输出结果:如果小于 180,输出 "YES";否则输出 "NO"。
代码
#include <iostream>
using namespace std;
int main() {
int score1, score2, score3;
cin >> score1 >> score2 >> score3;
// 比较总分与 180 的大小,避免浮点数运算
if (score1 + score2 + score3 < 180) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int score1 = sc.nextInt();
int score2 = sc.nextInt();
int score3 = sc.nextInt();
// 比较总分与 180 的大小,避免浮点数运算
if (score1 + score2 + score3 < 180) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
# 读取三科成绩
score1, score2, score3 = map(int, input().split())
# 比较总分与 180 的大小,避免浮点数运算
if score1 + score2 + score3 < 180:
print("YES")
else:
print("NO")
算法及复杂度
- 算法:条件判断与整数算术。
- 时间复杂度:
- 这是一个固定的计算和判断流程。
- 空间复杂度:
- 仅需常数空间存储变量。