题解:洛谷 P3954 成绩
【题目来源】
洛谷:P3954 [NOIP 2017 普及组] 成绩 - 洛谷
【题目描述】
牛牛最近学习了 C++ 入门课程,这门课程的总成绩计算方法是:
\(总成绩=作业成绩\times 20\%+小测成绩\times 30\%+期末考试成绩\times 50\%\)
牛牛想知道,这门课程自己最终能得到多少分。
【输入】
三个非负整数 \(A,B,C\),分别表示牛牛的作业成绩、小测成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是 \(100\) 分。
【输出】
一个整数,即牛牛这门课程的总成绩,满分也是 \(100\) 分。
【输入样例】
100 100 80
【输出样例】
90
【核心思想】
-
问题分析:给定三项成绩 \(A, B, C\)(作业、小测、期末),按权重 \(20\%, 30\%, 50\%\) 计算加权总成绩。结果要求为整数,满分 \(100\) 分。
-
算法选择:
- 加权求和:直接按公式 \(ans = A \times 0.2 + B \times 0.3 + C \times 0.5\) 计算
- 浮点转整:C++ 中浮点数赋值给整型变量自动截断小数部分,符合题目输出整数的要求
-
关键步骤:
- 读入数据:
cin >> a >> b >> c读取三项成绩 - 加权计算:
ans = a * 0.2 + b * 0.3 + c * 0.5- \(0.2 = 20\%\),\(0.3 = 30\%\),\(0.5 = 50\%\)
- 浮点乘法后求和,结果自动截断为整数
- 输出结果:
cout << ans << endl
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定次数的乘法和加法
- 空间复杂度:\(O(1)\),仅需三个整型变量
-
加权计算的核心思想:
- 权重分配:三项成绩按固定比例加权,体现不同考核环节的重要性差异
- 自动截断特性:C++ 中
int = double自动截断小数,无需显式取整 - 浮点运算安全:输入为 \([0, 100]\) 的整数,与 \(0.2, 0.3, 0.5\) 相乘后结果精确表示,无精度损失
- 适用于加权平均、成绩计算、比例分配类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int a, b, c;
int ans;
int main()
{
cin >> a >> b >> c; // 输入作业成绩、小测成绩、期末考试成绩
ans = a * 0.2 + b * 0.3 + c * 0.5; // 根据题目给出的公式计算结果
cout << ans << endl; // 输出结果
return 0;
}
【运行结果】
100 100 80
90
浙公网安备 33010602011771号